首頁 >後端開發 >C++ >如何正確處理 C# ForEach 迴圈中的非同步操作?

如何正確處理 C# ForEach 迴圈中的非同步操作?

Susan Sarandon
Susan Sarandon原創
2025-01-05 09:38:12377瀏覽

How to Properly Handle Asynchronous Operations within a C# ForEach Loop?

使用Async 和ForEach 查詢資料

在C# 中使用非同步操作時,了解如何將它們與程式碼正確整合非常重要像ForEach這樣的塊。嘗試在 ForEach 語句中使用 Async 關鍵字時會出現一個常見問題,這可能會導致編譯錯誤。

錯誤:當前上下文中不存在Async

如下面的程式碼片段所示,嘗試在ForEach 語句中使用Async 可能會導致錯誤:

using (DataContext db = new DataLayer.DataContext())
{
    db.Groups.ToList().ForEach(i => async {
        await GetAdminsFromGroup(i.Gid);
    });
}

The發生錯誤是因為當前上下文中不存在名稱「Async」。這是因為 ForEach 不支援非同步委託。

使用 Task.WhenAll 的替代方法

要有效處理 ForEach 語句中的非同步操作,可以使用 Task。 WhenAll 方法。此方法涉及將每個元素投影到非同步操作中:

using (DataContext db = new DataLayer.DataContext())
{
    var tasks = db.Groups.ToList().Select(i => GetAdminsFromGroupAsync(i.Gid));
    var results = await Task.WhenAll(tasks);
}

此方法提供了多個優點:

  • 正確的錯誤處理: Async void 方法不能抓住了。 Task.WhenAll 允許自然的異常處理。
  • 完成感知:透過使用 Task.WhenAll,可以確定所有非同步操作何時完成。
  • 自然檢索結果的語法: GetAdminsFromGroupAsync 意味著產生結果的操作,可以自然地傳回而不是設定為 side效果。

以上是如何正確處理 C# ForEach 迴圈中的非同步操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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