await
與 Task.Result
完成任務:比較分析
Stephen Cleary 的《Concurrency in C# Cookbook》示範了一種非阻塞任務完成偵測方法:
<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask;</code>
這就提出了一個問題:如果await
已經完成,第二個downloadTask
還有必要嗎?為什麼不簡單地使用downloadTask.Result
?
主要區別在於異常處理和死鎖避免。
異常處理:一個關鍵的區別
Task.Result
將異常包裝在 AggregateException
中,需要特定的處理。 然而,await
直接傳播異常,更好地與非同步程式碼的自然流程保持一致,並避免 AggregateException
管理的複雜性。
預防死鎖:安全網
Task.Result
和 Task.Wait
可能會導致死鎖,尤其是在非同步方法中。 由於在現實場景中明確確定任務完成情況通常具有挑戰性,await
提供了更安全的替代方案。
任務處理的最佳實踐
為了確保穩健且無死鎖的非同步編程,請遵循以下準則:
await
。 Task.Result
或 Task.Wait
在特定實用函數中可能是可以接受的,但始終有明確的文檔概述潛在風險。 Task.Result
和 Task.Wait
可能更適合仔細控制的平行場景。 在大多數情況下,await
是處理已完成任務的建議方法,確保可靠且無死鎖的非同步操作。
以上是已完成任務上的「await」與使用「Task.Result」相同嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!