首頁 >後端開發 >C++ >C# 中的 Await 與 Result:什麼時候應該使用 Await 而不是存取 Task.Result?

C# 中的 Await 與 Result:什麼時候應該使用 Await 而不是存取 Task.Result?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-22 23:03:11759瀏覽

Await vs. Result in C#: When Should You Use Await Instead of Accessing Task.Result?

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

答案在於異常處理和潛在死鎖的細微差別。 awaitResultWait處理異常的方式不同。 await避免將異常包裝在AggregateException中,這在非同步程式碼中通常是不希望看到的。此外,ResultWait可能會導致死鎖,尤其是在非同步方法中。

因此,建議優先使用await,除非可以明確確定任務已完成。一般來說,應避免在非同步應用程式程式碼中使用ResultWait。它們偶爾可以在非同步實用程式庫或並行任務程式碼中使用。

遵循這些準則,開發者可以提高非同步程式碼庫的安全性和可維護性,並提升程式碼可讀性。

以上是C# 中的 Await 與 Result:什麼時候應該使用 Await 而不是存取 Task.Result?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn