有人可以解释为什么AsyncMethod2
导致死锁吗?我(我想)我明白AsyncMethod1
中的顶级任务并没有尝试在BlockingMethod
捕获的上下文中继续执行它,从而避免了死锁,但是我不明白AsyncMethod2
内幕后发生了什么:
private static void BlockingMethod(IEnumerable<Object> data)
{
AsyncMethod1(data).Wait(); // no deadlock
AsyncMethod2(data).Wait(); // deadlock
}
private static async Task AsyncMethod1(IEnumerable<Object> data)
{
await Task.Run(async () =>
{
foreach (var obj in data)
{
await AsyncMethod2.(obj);
}
}).ConfigureAwait(false);
}
private static async Task AsyncMethod2(IEnumerable<Object> data)
{
await Task.Run(async () =>
{
foreach (var obj in data)
{
await AsyncMethod2.(obj).ConfigureAwait(false);
}
});
}
答案 0 :(得分:4)
await
中的AsyncMethod2
正在返回其上下文。我指的是实际位于await
的{{1}} - 即AsyncMethod2
。 <{1}}没有await Task.Run(...);
,因此它将恢复到其上下文。
循环中是否有ConfigureAwait(false)
是无关紧要的,因为该循环在线程池线程(await
)上运行,其中无论如何都没有上下文。