我已经看到了基本类型的并行聚合代码,例如
Parallel.For(0, result.Count, () => 0, (i, loop, subtotal) => { subtotal += result[i]; return subtotal; }, (x) => Interlocked.Add(ref sum, x) );
我想知道是否有相同的列表/其他集合,例如:
ListAllResults; Parallel.ForEach(allIDs, (currentID) => { subList.add(GetResultFor(currentID)); return subList; }, (x) => { lock(AllResults) AllResults.AddRange(subList); };
我猜测没有什么好看和整洁,但我想不出另一种做法,当然不是通过一个标准的parralel.ForEach因为我不能想到你会怎么说"这个核心有这个范围,这个核心这个范围"....
我认为在这两个示例中,PLINQ可以更好地为您服务,而无需在使用非线程安全集合时手动锁定.
您的总和计算可以转换为:
var sum = result.AsParallel().Sum();
而你的第二个例子List
可以转换为:
Listresults = allIDs.AsParallel() .Select(id => GetResultFor(id)) .ToList();
注意并行性与测试所说的一样好.并不总是会并行加速代码,有时它甚至可能会降低顺序循环的性能.