C# 无法在异步等待上复制死锁
我预计死锁会发生在以下代码上:C# 无法在异步等待上复制死锁,c#,.net,async-await,task-parallel-library,deadlock,C#,.net,Async Await,Task Parallel Library,Deadlock,我预计死锁会发生在以下代码上: 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 nu
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");
}
static async Task DelayAndReturnAsync(int val)
{
等待任务延迟(TimeSpan.FromSeconds(val));
返回val;
}
静态异步任务ProcessTaskAsync()
{
var taskA=await DelayAndReturnAsync(3);
int num=taskA++;
返回num;
}
静态void Main(字符串[]arg)
{
var testTask=ProcessTaskAsync();
testTask.Wait();
控制台。写入线(“完成”);
}
由于主线程(当前上下文)在调用ProcessTaskAsync()
并在teskTask.wait()
上被阻止后处于等待状态,因此当DelayAndReturnAsync()时,它无法返回到方法并继续其余代码
已完成。主线程将等待ProcessTaskAsync
完成,而ProcessTaskAsync
正在等待它(原始上下文)继续执行其余代码。因此出现了僵局
如果我的理解有什么问题,请告诉我。
我最初试图复制一个死锁,并测试在
processtaskaync
上使用ConfigureAwait(false)
方法的解决方案。e、 g.ProcessTaslAsync.ConfigureAwait(false)
只有在控制台应用程序中默认不存在的同步上下文出现时才会发生死锁。由于没有SynchronizationContext
作为开始,就好像每个wait
都隐式地添加configurewait(false)
您可以在UI或asp.net应用程序中尝试,或者更好地通过以下方式向测试添加SynchronizationContext
:
“AsyncContext类型提供了执行异步操作的上下文。Wait关键字需要返回上下文;对于大多数程序,这是一个UI上下文,您不必担心。ASP.NET还提供了一个适当的上下文,您不必使用自己的上下文
但是,控制台应用程序和Win32服务没有合适的上下文,在这些情况下可以使用AsyncContext
或AsyncContextThread
。”
您正在尝试在控制台应用程序中测试此功能吗?