【发布时间】:2016-12-24 17:22:18
【问题描述】:
我在一些地方读到.GetAwaiter().GetResult(); 可能导致死锁,我们应该使用async/await 代替。但是我看到许多使用它的代码示例。可以使用吗?哪些情况会导致死锁?还有什么我应该使用的,比如Task.Wait?
【问题讨论】:
标签: c# multithreading asynchronous async-await
我在一些地方读到.GetAwaiter().GetResult(); 可能导致死锁,我们应该使用async/await 代替。但是我看到许多使用它的代码示例。可以使用吗?哪些情况会导致死锁?还有什么我应该使用的,比如Task.Wait?
【问题讨论】:
标签: c# multithreading asynchronous async-await
正如我在博客中所描述的,GetAwaiter().GetResult() can deadlock when it's used in a one-thread-at-a-time context。这在 UI 线程或 ASP.NET 上下文(对于 pre-Core ASP.NET)中调用时最常见。
Wait 也有同样的问题。适当的解决方法是使用await,并使调用代码异步。
请注意,控制台应用程序中的 Main 方法是此规则的一个例外;在那里使用非常合适。许多代码示例都以这种方式使用它。
【讨论】:
GetAwaiter().GetResult()。我假设你的专用线程是无上下文的,所以它不应该死锁。