为什么ConfigureAwait(false)在迭代中不会出现死锁?

时间:2015-10-19 15:08:13

标签: c# asp.net .net async-await task

有人可以解释为什么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);
        }
    });
} 

1 个答案:

答案 0 :(得分:4)

await中的AsyncMethod2正在返回其上下文。我指的是实际位于await的{​​{1}} - 即AsyncMethod2。 <{1}}没有await Task.Run(...);,因此它将恢复到其上下文。

循环中是否有ConfigureAwait(false)是无关紧要的,因为该循环在线程池线程(await)上运行,其中无论如何都没有上下文。