Async/Await 方法的返回值:Task 還是 Void?
在異步編程中,async
方法的返回值是 Task
還是 void
會產生顯著的影響。本文將探討每種選擇適用的場景。
返回 Task
通常情況下,async
方法應該返回 Task
。這允許調用代碼 await
該任務,並在必要時跟踪其進度。此規則的主要例外情況是當您明確需要 void
返回類型時,例如處理事件時。
返回 Void
使用 void
返回類型的 async
方法將其標記為“頂級異步操作”。這些操作在發生異常時的行為與眾不同。與返回值的 Task
不同,void
異步方法中的異常默認情況下不會被觀察到。它們會成為未處理的異常,並可能觸發 TaskScheduler.UnobservedTaskException
處理程序。
考慮以下示例:
<code class="language-csharp">public static async void AsyncMethod2(int num) { await Task.Factory.StartNew(() => Thread.Sleep(num)); }</code>
在這個例子中,async
和 await
關鍵字是不必要的,因為不需要顯式處理異常。但是,如果發生異常,它將不會被觀察到,並且可能無法正確處理。
異常處理示例
為了演示 Task
和 void
異步方法之間異常處理的差異,請考慮以下代碼:
<code class="language-csharp">static async void f() { await h(); } static async Task g() { await h(); } static async Task h() { throw new NotImplementedException(); }</code>
如果調用 f
,則觀察到異常並將其視為任何其他未處理的異常。但是,如果調用 g
,則永遠不會觀察到異常,並且將由 TaskScheduler.UnobservedTaskException
處理程序處理,這將導致未定義的行為。
最佳實踐
作為一般最佳實踐,除非您明確需要 void
返回類型,否則始終從 async
方法返回 Task
。這確保了異常被正確處理,並且調用者可以選擇 await
該任務並跟踪其進度。
更多詳細信息,請參考 Microsoft 關於 async
/await
最佳實踐的文檔:https://www.php.cn/link/d3ddedd999aa150f47c2d0a55cb17898
以上是異步/等待:我應該返回任務還是無效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!