.GetAwaiter () .GetResult ();一般使用安全

本文关键字:安全 GetResult GetAwaiter | 更新日期: 2023-09-27 18:02:55

我在一些地方读到.GetAwaiter().GetResult();可能导致死锁,我们应该使用async/await来代替。但是我看到很多代码示例都使用了这个。可以用吗?在哪些情况下会发生死锁?还有什么我应该使用,像Task.Wait ?

.GetAwaiter () .GetResult ();一般使用安全

正如我在博客中所描述的,GetAwaiter().GetResult()在一次一个线程的上下文中使用时可能会死锁。这在UI线程或ASP中调用时最常见。.NET上下文(用于pre-Core ASP.NET)

Wait也有同样的问题。适当的修复是使用await,并使调用代码异步。

请注意,控制台应用程序中的Main方法是此规则的例外;在那里使用是非常合适的。许多代码示例都这样使用它。

在考虑这些事情时,查看官方文档总是有帮助的。在备注部分,您将看到如下内容:

此方法用于编译器使用;不要直接用在你的代码。

我认为这给了一个相当强的转向。它基本上是给。net开发者一个许可证,允许他们在未来改变它的工作方式。他们可能永远不会这样做,但我自己也不会有信心。至于你还应该使用什么,这取决于上下文,但async/await是最有可能的选择。