有关order preservation in PLINQ的msdn文档说明了有关ForAll()
的以下内容。
ForAll
方法的有序执行?我以前没有使用过PLINQ,但是下面的Code Review question似乎是合适的用法。在我的答案的底部,我写:
Events.AsParallel().AsOrdered().ForAll( eventItem =>
{
...
} );
阅读文档后,我相信AsOrdered()
不会改变任何内容吗?我还怀疑先前的查询无法替换顺序很重要的简单for
循环?可能还会并行调用StringBuilder
,从而导致输出错误?
有关PLINQ中的订单保留的msdn文档说明了有关ForAll()的以下内容。排序源序列时的结果:不确定地并行执行当...
结果
-即,输入可以按任何顺序进行处理ForAll
方法以任何特定顺序对可枚举元素执行操作,并且将默默地忽略AsOrdered()
方法调用。AsOrdered()
不会做任何改变-如果您想对并行查询的结果强制执行顺序,则可以简单地使用foreach()
ForAll()
来进行[[利用并行性,这意味着执行一次对集合中的多个项目产生副作用。实际上,排序仅适用于查询的结果(结果集合中项目的顺序),但这与ForAll()
无关,因为ForAll()
根本不影响该顺序。是-不能保证订单。
public static class ParallelExtensions
{
public static IEnumerable<T1> OrderedParallel<T,T1>(this List<T> list, Func<T,T1> action)
{
var unorderedResult = new List<(long, T1)>();
Parallel.ForEach(list, (o, state, i) => {
unorderedResult.Add((i, action.Invoke(o)));
});
var ordered = unorderedResult.OrderBy(o => o.Item1);
return ordered.Select(o => o.Item2);
}
}
使用方式: