我們有一個使用異步/等待模式的複雜ASP.Net核心應用程序。該應用程序最近停止響應,我們爲它做了內存轉儲。我們懷疑有一些異步操作會導致應用程序停滯不前,但不知道是哪一個。在爲Web應用程序進行內存轉儲後,由於使用async/await,線程返回到線程池,因此可以看到很少的正在運行的線程。 問題是,是否有可能在內存轉儲中列出正在運行的任務以及它們運行的位置,以便我可以確定哪些異步操作會使應用程序停滯不前?對於同步阻止調用很容易 - 只需列出所有活動線程的調用堆棧即可。但對於異步操作,它不再起作用。 (添加更多的痕跡是一種可能的方法,但情況是我們不能保證我們有足夠的痕跡來執行應用程序中的每個異步操作以及它是從屬庫。)如何在.net內存轉儲中列出正在運行的任務
例如,如果ASP.Net Core應用程序卡在這樣的一些代碼中,我怎麼能從內存轉儲中告訴它?
public async Task SomeBadMethodInADependentLibrary()
{
TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
await tcs.Task;
}