gpt4 book ai didi

c# - 无法在异步等待上复制死锁

转载 作者:太空狗 更新时间:2023-10-29 23:06:32 25 4
gpt4 key购买 nike

我预计以下代码会发生死锁:

static async Task<int> DelayAndReturnAsync(int val)
{
await Task.Delay(TimeSpan.FromSeconds(val));
return val;
}

static async Task<int> ProcessTaskAsync()
{
var taskA = await DelayAndReturnAsync(3);
int num = taskA++;
return num;
}

static void Main(string[] arg)
{
var testTask = ProcessTaskAsync();
testTask.Wait();
Console.WriteLine("Done");
}

由于主线程(当前上下文)在调用 ProcessTaskAsync() 并在 teskTask.Wait() 上被阻塞后处于等待状态,因此无法返回到方法并在 DelayAndReturnAsync() 完成时继续执行其余代码。主线程将等待 ProcessTaskAsync 完成,而 ProcessTaskAsync 正在等待它(原始上下文)继续代码的其余部分。从而陷入僵局。

如果我的理解有问题,请告诉我。我最初试图复制死锁并测试在 ProcessTaskAsync 上使用 ConfigureAwait(false) 方法的解决方案。例如ProcessTaslAsync.ConfigureAwait(false)

最佳答案

只有在 SynchronizationContext 出现时才会发生死锁,控制台应用程序中默认情况下不存在该情况。由于没有 SynchronizationContext 开始,就好像每个 await 都隐式添加了 ConfigureAwait(false)

您可以在 UI 或 asp.net 应用程序中尝试它,或者更好地使用 Stephen Cleary's AsyncContextSynchronizationContext 添加到您的测试中:

"The AsyncContext type provides a context for executing asynchronous operations. The await keyword requires a context to return back to; for most programs, this is a UI context, and you don't have to worry about it. ASP.NET also provides a proper context and you don't have to use your own.

However, Console applications and Win32 services do not have a suitable context, and AsyncContext or AsyncContextThread could be used in those situations."

关于c# - 无法在异步等待上复制死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32123076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com