如果 ConfigureAwait(false) 在迭代中,为什么它不能防止死锁?

sha*_*y__ -1 .net c# asp.net task async-await

有人可以解释为什么AsyncMethod2会导致死锁吗?我(认为我)理解顶级 Task inAsyncMethod1不会尝试在由 捕获的上下文中执行它的延续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);
        }
    });
} 
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

awaitAsyncMethod2正在回归它的上下文。我指的await是实际存在的AsyncMethod2- 即await Task.Run(...);. 没有ConfigureAwait(false)那个await,所以它会恢复到它的上下文。

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