首頁 >後端開發 >C++ >異步/等待:我應該返回任務還是無效?

異步/等待:我應該返回任務還是無效?

Susan Sarandon
Susan Sarandon原創
2025-02-01 14:06:10370瀏覽

Async/Await: Should I Return a Task or Void?

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>

在這個例子中,asyncawait 關鍵字是不必要的,因為不需要顯式處理異常。但是,如果發生異常,它將不會被觀察到,並且可能無法正確處理。

異常處理示例

為了演示 Taskvoid 異步方法之間異常處理的差異,請考慮以下代碼:

<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中文網其他相關文章!

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