理解非同步程式設計中的 Task<T>.Result
和 await Task<T>
在非同步程式設計中,await Task<T>
和 Task<T>.Result
之間的選擇會顯著影響效能和異常處理。 讓我們來看看主要的區別。
GetName
方法說明了兩種方法:
使用Task<T>.Result
:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return nameTask.Result; }</code>
nameTask.Result
阻塞目前線程,直到任務完成。這對於長時間運行的操作來說效率低下,可能會導致應用程式凍結。
使用await Task<T>
:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return await nameTask; }</code>
await nameTask
釋放呼叫線程,允許其他任務並發執行。 此方法僅在 nameTask
完成時恢復。
關鍵區別:
Task<T>.Result
阻塞; await Task<T>
沒有。 await Task<T>
直接傳播異常; Task<T>.Result
將它們包裹在 AggregateException
中。 最佳實務:
Task.Factory.StartNew
;使用 Task.Run
來提高效率並更好地與 .NET 執行緒池整合。 Task<T>.Result
和 Task.Factory.StartNew
可用於動態任務並行性,但在非同步程式設計情境中通常不鼓勵使用它們,而是使用 await
以獲得更好的回應能力和可維護性。 使用 await
是非同步操作的首選且更健壯的方法。 以上是`Task.Result` 與 `await Task`:什麼時候該使用哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!