在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}},它们也会生成相同的有序结果。有人可以告诉我为什么吗?
答案 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