首頁 >後端開發 >C++ >非同步操作可以與 ForEach 一起使用嗎?

非同步操作可以與 ForEach 一起使用嗎?

Patricia Arquette
Patricia Arquette原創
2025-01-05 18:41:40403瀏覽

Can Async Operations Be Used with ForEach, and What's the Best Alternative?

在 ForEach 中使用非同步

問題:

在 ForEach 上下文中使用非同步功能是否可行?下面提供了描述嘗試實現的程式碼片段:

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

但是,在執行時,出現以下錯誤:

The name 'Async' does not exist in the current context

注意,封裝using 語句的方法已被指定為

答案:

List 使用的ForEach 的實作本質上與非同步功能不相容(類似於 LINQ-to-objects)。

對於這種特定場景,建議採用替代方法。這涉及將每個元素投影到非同步操作中。隨後,可以非同步等待這些操作的完成。

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

與使用ForEach 的非同步委託相比,此方法具有多個優勢:

  • 增強的錯誤處理: 源自async void 操作的異常不能用catch 處理。或者,此方法將在等待 Task.WhenAll 的行傳播異常,從而啟用自然的異常處理功能。
  • 完成可見性: 任務的結束在結束時很容易辨別這個方法歸功於Task.WhenAll的使用。相較之下,async void 操作缺乏確定完成的直接方法。
  • 自然語法: 這種方法與檢索結果的自然語法一致。 GetAdminsFromGroupAsync 意味著產生結果的操作(管理員),當此類操作可以傳回其結果而不是依賴副作用來設定值時,使此程式碼更加直觀。

以上是非同步操作可以與 ForEach 一起使用嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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