gpt4 book ai didi

c# - Parallel.ForEach 与异步 lambda 等待所有迭代完成

转载 作者:行者123 更新时间:2023-12-03 12:42:51 25 4
gpt4 key购买 nike

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

有什么办法可以写:

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 字段不正确,因为它会在执行所有迭代时返回 true,无论它们的实际 lambda 作业是否完成?

最佳答案

recently I have seen several SO threads related to Parallel.ForEach mixed with async lambdas, but all proposed answers were some kind of workarounds.



嗯,那是因为 Parallel不适用于 async .从不同的角度来看,您首先为什么要混合它们?他们做相反的事情。 Parallel都是关于添加线程和 async就是放弃线程。如果你想并发做异步工作,那么使用 Task.WhenAll .这是完成这项工作的正确工具; Parallel不是。

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

How can I ensure that list will contain all items from all iterations executed withing lambdas in each iteration?



你需要有某种信号,一些代码可以阻塞直到处理完成,例如, CountdownEventMonitor .附带说明一下,您需要保护对非线程安全 List<T> 的访问。以及。

How will generally Parallel.ForEach work with async lambdas, if it hit await will it hand over its thread to next iteration?



Parallel不懂 async lambdas,当第一个 await产生(返回)给它的调用者, Parallel将假设循环的交互已完成。

I assume ParallelLoopResult IsCompleted field is not proper one, as it will return true when all iterations are executed, no matter if their actual lambda jobs are finished or not?



正确的。至于 Parallel知道,它只能“看到”第一个 await的方法返回给它的调用者。所以它不知道什么时候 async lambda 完成。它还会假设迭代过早完成,这会导致分区中断。

关于c# - Parallel.ForEach 与异步 lambda 等待所有迭代完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60368329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com