.NET 4.5 中 HttpClient.GetAsync()
與 Async/Await 導致死鎖
在 .NET 4.5 中,使用 HttpClient
類別結合 async/await
模式時,某些情況下可能會出現 httpClient.GetAsync(...)
的結果「等待」無限期掛起的問題。在提供的程式碼中,在「test5」案例中觀察到此行為,並引發了 HttpClient
類別中是否存在錯誤或 API 是否被誤用的問題。
死鎖原因
死鎖是由 async/await
模式使用的執行緒上下文和同步機制與某些方法固有的執行緒阻塞行為不匹配造成的。在 ASP.NET 請求上下文中等待 Task
時,該方法通常會在捕獲的 SynchronizationContext
上恢復,確保請求上下文的保留。
然而,在 test5 的情況下,AsyncAwait_GetSomeDataAsync
在等待 HttpClient.GetAsync
的結果時啟動了一個阻塞操作,即 Test5Controller.Get
。這阻塞了擁有請求上下文的線程,阻止了在該上下文中處理 Task
的完成。
Async/Await 和 HttpClient 使用的最佳實踐
為了避免這種死鎖情況,建議採用以下最佳實務:
ConfigureAwait(false)
。這允許延續在普通的執行緒池執行緒上運行,繞過 ASP.NET 請求上下文。 Task
操作;而應在整個程式碼中利用 async/await
模式。 透過遵守這些實踐,可以同時實現使用async/await
的兩個好處:在單獨的線程池線程上運行延續,而無需ASP.NET 請求上下文,並保持控制器本身為異步以防止請求線程阻塞。
以上是為什麼 .NET 4.5 中的 HttpClient.GetAsync() 與 Async/Await 會死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!