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
。”


您正在尝试在控制台应用程序中测试此功能吗?