我在几个地方阅读到.GetAwaiter().GetResult();
可能会导致死锁,因此我们应该使用async
/await
。但是我看到很多代码示例中仍然使用它。我可以使用它吗?在哪些情况下它可能会死锁?是否有其他可用的替代方法,例如Task.Wait
?
我在几个地方阅读到.GetAwaiter().GetResult();
可能会导致死锁,因此我们应该使用async
/await
。但是我看到很多代码示例中仍然使用它。我可以使用它吗?在哪些情况下它可能会死锁?是否有其他可用的替代方法,例如Task.Wait
?
正如我在我的博客上描述的那样,GetAwaiter().GetResult()
在单线程上下文中使用时可能会发生死锁问题。这在调用UI线程或ASP.NET(在Core之前的ASP.NET)上最常见。
Wait
也存在同样的问题。适当的解决方法是使用await
并使调用代码异步化。
请注意,控制台应用程序中的Main
方法是一个例外;在那里使用它是完全合适的。许多代码示例都是这样使用它的。
我认为这提供了一个相当强的指引。它基本上给了.Net的开发人员一个许可证,在未来更改它的工作方式。他们可能永远不会这样做,但我自己不会感到自信。至于您应该使用什么其他内容,这取决于上下文,但async/await是最有可能的替代方案。此方法适用于编译器使用;请勿直接在代码中使用。
GetAwaiter().GetResult()
。我假设你的专用线程是无上下文的,所以它不应该出现死锁。 - Stephen Cleary