首頁 > 後端開發 > C++ > 我應該在非同步 C# 方法中等待或返回任務嗎?

我應該在非同步 C# 方法中等待或返回任務嗎?

DDD
發布: 2025-01-04 04:12:39
原創
689 人瀏覽過

Should I Await or Return Tasks in Async C# Methods?

非同步方法中的等待與返回:後果探索

在C# 中進行非同步程式設計時,開發人員經常會遇到是否要在另一個方法中等待非同步方法呼叫的問題非同步方法或簡單地傳回任務。雖然這兩種方法似乎都有效,但每個選項都有不同的後果,值得考慮。

選項 A:直接傳回任務

在這個方法中,非同步方法直接傳回從巢狀非同步呼叫所獲取的任務。這類似於編寫:

Task FooAsync()
{
    return BazAsync();  // Option A
}
登入後複製

結果:

  • 呼叫者負責等待返回的任務。
  • 方法可以從同步和非同步上下文中呼叫。
  • 在方法中的同步程式碼將同步傳遞。
  • 參數驗證可以同步進行。

選項 B:等待任務

等待任務時,非同步方法明確等待巢狀非同步呼叫完成。寫成:

async Task BarAsync()
{
    await BazAsync(); // Option B
}
登入後複製

結果:

  • 方法必須宣告為非同步,因為它執行等待操作。
  • 呼叫者不需要等待方法本身。
  • 非同步程式碼中拋出的異常將非同步傳遞。
  • 參數驗證無法同步執行。

選擇正確的選項

返回或等待之間的選擇取決於根據特定場景和要求。

如果該方法執行少量同步工作並且只呼叫一個非同步方法,返回任務(選項 A)可能是一種更有效的方法。但是,如果該方法需要執行額外的非同步工作或非同步處理異常,那麼等待任務(選項 B)是合適的選擇。

要注意的是,宣告為非同步的方法不能直接回傳任務。如果方法必須傳回任務,則它本身必須聲明為非同步。

實際範例

考慮以下程式碼片段:

// Version 1:
Task BarAsync()
{
    // No need to gronkle yet...
    return BazAsync();
}

// Oops, for version 2 I need to do some more work...
async Task BarAsync()
{
    int gronkle = await GronkleAsync();
    // Do something with gronkle

    // Now we have to await BazAsync as we're now in an async method
    await BazAsync();
}
登入後複製

最初,BarAsync 方法不需要等待 BazAsync,因此它直接回傳任務。然而,當引入額外的非同步工作時,BarAsync 必須轉換為非同步方法並等待 BazAsync。

透過了解非同步方法中返回或等待的後果,開發人員可以有效地實現非同步程式碼並避免潛在的陷阱.

以上是我應該在非同步 C# 方法中等待或返回任務嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板