最近我看到了几个与Parallel.ForEach和异步lambda相关的SO帖子,但所有提出的答案都是某种变通方法。
有没有什么办法可以写成以下这种形式:
List<int> list = new List<int>[]();
Parallel.ForEach(arrayValues, async (item) =>
{
var x = await LongRunningIoOperationAsync(item);
list.Add(x);
});
如何确保列表将包含每个迭代中由lambda执行的所有项?
如果遇到await,Parallel.ForEach通常会如何处理异步lambda?它会将其线程移交给下一个迭代吗?
我假设ParallelLoopResult IsCompleted字段不是正确的字段,因为它将在执行所有迭代时返回true,无论它们的实际lambda作业是否完成?
var results = await Task.WhenAll(arrayvalues.Select(x => LongRunningIoOperationAsync(x)))
。并行更适合于CPU密集型工作而不是IO密集型工作。 - juharrParallel.ForEach
内部调用list.Add(x)
。 - Enigmativity