Parallel.Foreach维护收集顺序?

Bri*_*man 3 parallel-processing asp.net-4.0 task-parallel-library parallel-for

使用时有没有办法保证订单Parallel.ForEach()?我正在循环的集合需要保持它的顺序,但我正在寻找一些性能改进.

小智 9

为了保持顺序,您必须在将列表传递给 foreach 循环之前尝试对列表进行排序,因为默认情况下 Parallel.Foreach 将列表视为无序。

例子 :

Parallel.ForEach(
list.AsParallel().AsOrdered(), 
(listItems) => {<operations that you need to do>});
Run Code Online (Sandbox Code Playgroud)


Ade*_*ler 7

所以你有一个看起来像这样的声明?(根据您的上述评论).

Parallel.Foreach(myData, ..., (d) =>
{
  StringBuilder sb = new StringBuilder();
  sb.Append(d);
  // WriteLine sb?
});
Run Code Online (Sandbox Code Playgroud)

这种方法存在许多问题.

  1. 不会Parallel.ForParallel.ForEach将保证您以myData任何特定顺序访问您对内容的访问权限.
  2. 如果您是Console上的方法或共享StringBuilder 输出结果或构建完整的字符串,那么您可能阻止共享资源,有效地序列化并行循环的部分.

如果没有看到代码的具体示例,很难说更多.根据您的工作情况,您可以使用AsOrdered()PLINQ中的订单保存来获取您想要的位置.
请参阅此MSDN资源订购的PLINQ ForAll

这将允许您根据输入顺序返回有序的结果集,但保证实际处理的顺序.但是,如果并行查询阻塞了正文中的调用,则不太可能获得良好的性能.


Cod*_*313 -3

不,ForEach 只能用于顺序不重要的情况;尝试并行.For