我预计以下代码会发生死锁:
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()
并阻塞在taskTask.Wait()
之后,主线程(当前上下文)被放置在等待状态,当DelayAndReturnAsync()
完成时,它无法返回到方法并继续代码的其余部分。主线程将等待ProcessTaskAsync
完成,而ProcessTaskAsync
则在等待它(原始上下文)继续其余代码。因此会发生死锁。
如果我的理解有误,请告诉我。
我最初尝试复制死锁并测试使用ConfigureAwait(false)
方法的解决方案,例如ProcessTaslAsync.ConfigureAwait(false)
。