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)
所以你有一个看起来像这样的声明?(根据您的上述评论).
Parallel.Foreach(myData, ..., (d) =>
{
StringBuilder sb = new StringBuilder();
sb.Append(d);
// WriteLine sb?
});
Run Code Online (Sandbox Code Playgroud)
这种方法存在许多问题.
Parallel.For或Parallel.ForEach将保证您以myData任何特定顺序访问您对内容的访问权限.StringBuilder
输出结果或构建完整的字符串,那么您可能阻止共享资源,有效地序列化并行循环的部分.如果没有看到代码的具体示例,很难说更多.根据您的工作情况,您可以使用AsOrdered()PLINQ中的订单保存来获取您想要的位置.
请参阅此MSDN资源和
订购的PLINQ ForAll
这将允许您根据输入顺序返回有序的结果集,但不保证实际处理的顺序.但是,如果并行查询阻塞了正文中的调用,则不太可能获得良好的性能.