C# Task.GetAwaiter().GetResult()导致Windows服务死锁
我有一个大量使用Async/Await的应用程序。我遇到了一个无法解释的问题 我正在调用C# Task.GetAwaiter().GetResult()导致Windows服务死锁,c#,.net,async-await,C#,.net,Async Await,我有一个大量使用Async/Await的应用程序。我遇到了一个无法解释的问题 我正在调用.GetAwaiter().GetResult(),遇到了死锁。我不明白为什么我在一个不应该有SynchronizationContext的Windows服务中。此外,当进程挂起时,我从进程中抓取了一个转储文件,在Visual Studio中打开它,System.Threading.SynchronizationContext.Current的值为null 为什么会阻塞?我显然遗漏了一些东西。在异步/Wait
.GetAwaiter().GetResult()
,遇到了死锁。我不明白为什么我在一个不应该有SynchronizationContext
的Windows服务中。此外,当进程挂起时,我从进程中抓取了一个转储文件,在Visual Studio中打开它,System.Threading.SynchronizationContext.Current
的值为null
为什么会阻塞?我显然遗漏了一些东西。在异步/Wait上下文中,您应该避免使用GetResult()、访问Task的Result成员或调用Task的Wait()方法。这样做不仅会阻塞任务,还会阻塞线程,导致该线程上的所有任务都被阻塞,通常会导致死锁
相反,你应该等待任务。使用wait不会阻塞线程,因此它允许其他任务完成 为什么在一个大量使用Async/Await的应用程序中调用
.GetAwaiter().GetResult()
?您缺少用于复制/上下文解释此行为的代码。请向我们显示您认为存在死锁情况的热点(代码块)。我假设您正在尝试以同步方法调用异步方法。如果是,那么为什么不将方法调用封装在一个Task.Run()
中,并得到如下结果:Task.Run(async()=>wait yourAsyncMethod()).result.
。将代码减少到演示问题的最小示例中,您可能会找到问题所在。