Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Task.GetAwaiter().GetResult()导致Windows服务死锁_C#_.net_Async Await - Fatal编程技术网

C# Task.GetAwaiter().GetResult()导致Windows服务死锁

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

我有一个大量使用Async/Await的应用程序。我遇到了一个无法解释的问题

我正在调用
.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.
。将代码减少到演示问题的最小示例中,您可能会找到问题所在。