PLINQ真的没有保留秩序吗?

时间:2017-01-14 16:15:56

标签: c# linq plinq

MSDN,据说PLINQ不保留顺序。我想在我的项目中展示它,但我有一个问题,那就是一直保留订单。我有一个集合var linqQuery = table .Where(n => Enumerable.Range(2, (int) Math.Sqrt(n.Item1)).All(i => n.Item1 % i > 0)) .Take(10) .ToList(); var plinqQuery = table .AsParallel() .Where(n => Enumerable.Range(2, (int) Math.Sqrt(n.Item1)).All(i => n.Item1 % i > 0)) .Take(10) .ToList(); ,这些是我的疑问:

.AsOrdered()

即使我不使用{{1}},它们也会生成相同的有序结果。有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:4)

PLINQ不保证按顺序处理项目。它是否按顺序处理它们取决于几个因素。

首先,事先不知道操作执行的线程数。在小例子中,可能只使用一个或两个线程。

其次,请记住Task不等于线程。任务是做什么的。线程是运行它的引擎。任务管理器选择将哪个任务放在哪个线程上。它不会因为有任务等待而运行新线程,除非有未使用的CPU资源来真正运行该线程。

第三,即使有多个线程并行运行任务,任务也可能按照启动它们的顺序完成。

结论是PLINQ不会做任何事情来使任务按照它们被初始化的相同顺序运行,并且真正的执行顺序是几个因素的结果。您的代码不应该依赖于任何结果。

答案 1 :(得分:1)

如果你只是想展示它,为什么不使用一个简单的ForEach vs ForAll和一个大的Enumerable集?

例如:

.as-console-wrapper { max-height: 100% !important; top: 0; }

您可能会在最后一个订单中加扰订单。 Test it in .NET Fiddle