首頁 > 後端開發 > C++ > 可以並行有效地利用異步lambda表達式嗎?

可以並行有效地利用異步lambda表達式嗎?

Linda Hamilton
發布: 2025-02-01 03:26:09
原創
519 人瀏覽過

Can Parallel.ForEach Effectively Utilize Asynchronous Lambda Expressions?

並行性和異步lambdas:平衡行為

通過在多個核心上分配工作負載,

並行處理可顯著提高性能。 但是,將異步的lambda表達式集成在平行環內提出了獨特的挑戰。

問題:丟失任務

考慮此示例:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // Pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // Post-processing
});
var count = bag.Count; // count is often 0</code>
登入後複製

>經常保留0,因為count>的背景線程不會等待異步操作完成。 幼稚的嘗試解決此問題:Parallel.ForEach

<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
  // Pre-processing
  var responseTask = GetData(item);
  responseTask.Wait();
  var response = responseTask.Result;
  bag.Add(response);
  // Post-processing
});
var count = bag.Count;</code>
登入後複製
在確保任務完成的同時,它通過阻止線程和需要手動異常處理來否定異步編程的優勢。

>

有效解決方案

用於使用異步lambdas的直接並行處理:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
var tasks = myCollection.Select(async item =>
{
  // Pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // Post-processing
});
await Task.WhenAll(tasks);
var count = bag.Count;</code>
登入後複製
此方法為每個項目創建一個任務,從而實現異步執行。

確保所有任務在繼續之前完成。 Task.WhenAll>

>有關更複雜的方案,斯蒂芬·圖布(Stephen Toub)的博客文章提供了高級技術和最佳實踐。 這為平行循環內處理異步操作提供了一種更強大,更有效的解決方案。

以上是可以並行有效地利用異步lambda表達式嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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