2016-08-17 50 views
13

我在幾個地方看過.GetAwaiter().GetResult();可能導致死鎖,我們應該使用async/await來代替。但是我看到很多代碼示例在這裏使用。可以使用它嗎?哪種情況下可能發生死鎖?有什麼我應該使用的,如Task.WaitIs .GetAwaiter()。GetResult();一般使用安全嗎?

+0

太廣泛,重複的話題。開始搜索SO –

回答

23

正如我在我的博客上描述的,GetAwaiter().GetResult() can deadlock when it's used in a one-thread-at-a-time context。這是在UI線程或ASP.NET上下文中調用時(對於核心ASP.NET之前)最常見的。

Wait也有同樣的問題。適當的修復方法是使用await,並使調用代碼異步。

請注意,Console應用程序中的Main方法是此規則的一個例外;在那裏使用是完全合適的。許多代碼示例以這種方式使用它。

+0

我認爲WebApi服務也是如此,對嗎? – Cyan

+0

@Cyan:是的,任何種類的ASP.NET請求上下文。 Pre-Core,就是這樣; ASP.NET Core中刪除了請求上下文。 –

+0

謝謝Stephen! – Cyan