首页 >后端开发 >C++ >可以并行有效地利用异步lambda表达式吗?

可以并行有效地利用异步lambda表达式吗?

Linda Hamilton
Linda Hamilton原创
2025-02-01 03:26:09517浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn