具有异步lambda的Parallel.ForEach等待所有迭代完成

ldragicevic

最近,我看到了几个与Parallel.ForEach相关的SO线程与异步lambda混合在一起,但是所有提出的答案都是某种解决方法。

有什么办法可以写:

List<int> list = new List<int>[]();

Parallel.ForEach(arrayValues, async (item) =>
{
  var x = await LongRunningIoOperationAsync(item);
  list.Add(x);
});

如何确保列表将包含每个迭代中使用lambda执行的所有迭代中的所有项目?

通常Parallel.ForEach如何与异步lambdas一起使用,如果它等待命中,它将把其线程移交给下一个迭代吗?

我假设ParallelLoopResult IsCompleted字段不合适,因为在执行所有迭代时,无论其实际的lambda作业是否完成,它都将返回true。

斯蒂芬·克莱里

最近,我看到了几个与Parallel.ForEach相关的SO线程与异步lambda混合在一起,但是所有提出的答案都是某种解决方法。

恩,那是因为Parallel 不适用于async从另一个角度来看,为什么要首先将它们混合?他们做相反的事情Parallel都是关于添加线程,而仅仅async是放弃线程。如果要同时进行异步工作,请使用Task.WhenAll那是完成这项工作的正确工具。Parallel不是。

就是说,听起来您想使用错误的工具,所以这里是您的操作方法...

如何确保列表将包含每个迭代中使用lambda执行的所有迭代中的所有项目?

您需要具有某种信号,某些代码可能会阻塞该信号,直到处理完成为止,例如CountdownEventMonitor附带说明一下,您还需要保护对非线程安全的访问List<T>

通常Parallel.ForEach如何与异步lambdas一起使用,如果它等待命中,它将把其线程移交给下一个迭代吗?

由于Parallel不了解asynclambda,因此当第一个await产生(返回)其调用者时,Parallel将假定循环已完成。

我假设ParallelLoopResult IsCompleted字段不合适,因为在执行所有迭代时,无论其实际的lambda作业是否完成,它都将返回true。

正确。Parallel了解,它只能“看到”await返回给调用者的第一个方法因此,它不知道asynclambda何时完成。它还将假定迭代完成得太早,这将导致分区失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使Parallel等待所有异步任务完成?

来自分类Dev

等待完成异步 lambda 表达式中的所有异步方法

来自分类Dev

AngularJS等待foreach中的所有异步调用完成

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

NodeJS等待所有异步命令完成

来自分类Dev

如何等待所有异步完成?

来自分类Dev

具有异步功能的JavaScript数组

来自分类Dev

具有异步请求的NodeJS

来自分类Dev

具有异步结构的openxml

来自分类Dev

具有异步功能的OracleCommand ExecuteNonQuery

来自分类Dev

具有异步功能的装饰器

来自分类Dev

具有异步功能的意外令牌

来自分类Dev

具有异步请求的递归函数

来自分类Dev

具有异步方法的RxJava for循环?

来自分类Dev

具有异步和等待的MVC动作

来自分类Dev

具有异步/等待的可扩展操作

来自分类Dev

具有异步/等待功能的npm mv模块

来自分类Dev

具有异步QFileSystemModel的Qt异步显示

来自分类Dev

具有异步委托的异步函数的命名约定

来自分类Dev

使异步收集等待所有任务完成

来自分类Dev

如何进行循环等待所有异步功能完成。异步函数里面有多个异步函数

来自分类常见问题

如何等待所有异步调用完成

来自分类Dev

你如何等待所有异步调用在Java中完成?

来自分类Dev

如何等待所有异步调用完成

来自分类Dev

ForEach(内部具有异步功能)完成后的回调

来自分类Dev

等待带有异常处理的所有任务的完成

来自分类Dev

等待所有任务完成