首页 > 后端开发 > C++ > 我如何与Parallel.Foreach合适使用异步Lambda函数?

我如何与Parallel.Foreach合适使用异步Lambda函数?

Barbara Streisand
发布: 2025-02-01 03:31:08
原创
989 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板