首頁 >後端開發 >C++ >我如何與Parallel.Foreach合適使用異步Lambda函數?

我如何與Parallel.Foreach合適使用異步Lambda函數?

Barbara Streisand
Barbara Streisand原創
2025-02-01 03:31:08995瀏覽

How Can I Properly Use Asynchronous Lambda Functions with Parallel.ForEach?

與異步lambda函數的並行處理

結合併行處理和異步lambda函數需要仔細考慮。 本文解決了在

中使用

方法的挑戰,並提供有效的解決方案。 async Parallel.ForEach>

parallel.foreach和async lambdas

的問題

啟動背景線程,這些線程本質上不等待任務完成。 這會在Lambda表達式內使用

時會產生問題。以下示例說明了此問題:Parallel.ForEach await

>將為0,因為主線程在背景線程完成其異步操作之前繼續執行。 如下所示,使用
<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // some pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // some post-processing
});
var count = bag.Count; // count will be 0</code>
作為解決方法,否定了

的好處,並且需要明確的例外處理:count Wait() 使用task.whenall await

>的解決方案
<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
  // some pre-processing
  var responseTask = GetData(item);
  responseTask.Wait();
  var response = responseTask.Result;
  bag.Add(response);
  // some post-processing
});
var count = bag.Count;</code>

一個更有效的解決方案涉及利用來管理異步操作:

Task.WhenAll這種方法允許各項處理每個項目,並確保所有任務在繼續執行之前完成。

<code class="language-csharp">var bag = new ConcurrentBag<object>();
var tasks = myCollection.Select(async item =>
{
  // some pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // some post-processing
});
await Task.WhenAll(tasks);
var count = bag.Count; // count will be correct</code>
高級解決方案:foreachAsync

Task.WhenAll

>對於更複雜的異步並行處理,請探索Stephen Toub的博客文章。 這為處理複雜方案提供了強大而靈活的解決方案。

>

以上是我如何與Parallel.Foreach合適使用異步Lambda函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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