C#非同步操作阻塞於Task.Result屬性:死鎖詳解
使用C#的async和await關鍵字進行非同步程式設計有時會產生令人困惑的行為。本文深入探討了一個場景,其中非同步操作在Task的Result屬性處停止。
問題描述
開發者在一個使用非同步方法檢索資料的經典三層應用中遇到此問題。 ExecuteAsync
方法在執行緒池執行緒上啟動SQL操作,後續方法GetTotalAsync
使用await存取結果。然而,當UI方法存取非同步任務的Result屬性時,應用程式會凍結。
根本原因:死鎖
問題的根源在於使用任務並行庫(TPL)時的一個常見錯誤。預設情況下,運行時在最初啟動方法的相同SynchronizationContext上調度函數的延續。在大多數情況下,這種行為是理想的。但是,當操作在UI執行緒上啟動,然後被對Result的呼叫阻塞時,就會導致死鎖。
解
為了解決死鎖,有幾個方法:
.ConfigureAwait(false)
可以確保延續總是在執行緒池上調度,而不管呼叫上下文如何。 其他注意事項
以上是為什麼我的非同步 C# 操作在存取任務的結果屬性時掛起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!