【发布时间】:2017-06-01 15:22:54
【问题描述】:
我们有一个使用 async/await 模式的复杂 ASP.Net Core 应用程序。该应用程序最近停止响应,我们为它进行了内存转储。我们怀疑有一些异步操作导致应用卡住,但不确定是哪一个。在为 Web 应用程序进行内存转储后,我们可以看到运行线程非常少,因为线程由于使用 async/await 而返回到线程池。 问题是,是否可以在内存转储中列出正在运行的任务以及它们运行到的位置,以便我可以判断哪个异步操作使应用程序卡住了?对于同步阻塞调用,这很容易——只需列出所有活动线程的调用堆栈。但是对于异步操作,它不再起作用了。 (添加更多跟踪是一种可能的方法,但情况是我们无法保证应用程序中的每个异步操作及其依赖库都有足够的跟踪。)
例如,如果一个 ASP.Net Core 应用程序卡在类似这样的代码中,我如何从内存转储中判断它?
public async Task SomeBadMethodInADependentLibrary()
{
TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
await tcs.Task;
}
【问题讨论】:
标签: .net multithreading asynchronous windbg sos