C#非同步程式設計中Await與Result的比較
在C#非同步程式設計中,await
關鍵字用於掛起執行,直到任務完成。然而,有些開發者會質疑,如果任務已完成,為什麼還需要await
,直接存取Task.Result
屬性不行嗎?本文將探討這個問題,並解釋為什麼要優先使用await
。
Stephen Cleary在其著作《Concurrency in C# Cookbook》中建議使用以下程式碼片段:
<code class="language-C#">var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask; </code>
這裡,downloadTask
代表一個HTTP GET請求,timeoutTask
作為超時監控。如果HTTP請求在給定時間內未完成,則timeoutTask
完成。
假設HTTP請求在逾時前完成。在這種情況下,downloadTask
已經完成。那麼,為什麼程式碼片段還要使用第二個await
?為什麼不直接用downloadTask.Result
?
答案在於異常處理和潛在死鎖的細微差別。 await
與Result
或Wait
處理異常的方式不同。 await
避免將異常包裝在AggregateException
中,這在非同步程式碼中通常是不希望看到的。此外,Result
和Wait
可能會導致死鎖,尤其是在非同步方法中。
因此,建議優先使用await
,除非可以明確確定任務已完成。一般來說,應避免在非同步應用程式程式碼中使用Result
和Wait
。它們偶爾可以在非同步實用程式庫或並行任務程式碼中使用。
遵循這些準則,開發者可以提高非同步程式碼庫的安全性和可維護性,並提升程式碼可讀性。
以上是C# 中的 Await 與 Result:什麼時候應該使用 Await 而不是存取 Task.Result?的詳細內容。更多資訊請關注PHP中文網其他相關文章!