PLINQ的运行功效是无序的,也就是不连结本来调集的挨次来操纵(固然除了一些专门的排序操纵)。原因则是线程的并发执行原来就充塞了不确定性,把本来一个任务支解成好几个部分同时进行返回的功效会打乱本来的挨次,如果要强制保存挨次,必定要浪费一些性能,PLINQ是可以这样的,但默认不这样。
先看一个LINQ示例:
var arr = new int[] { 1, 2, 3, 4, 5 };
var res = arr.Where(i => i != 3);
功效是:
1, 2, 4, 5
挨次是连结的。而PLINQ:
var res = arr.AsParallel().Where(i => i != 3);
功效挨次变了:
1, 4, 5, 2
使用PLINQ的AsOrdered和AsUnordered可以命令PLINQ执行保存原调集挨次或者不保存。
把上面的PLINQ改成:
var res = arr.AsParallel().AsOrdered().Where(i => i != 3);
功效就是:1, 2, 4, 5了。
不过如果对PLINQ调集进行了排序那么后续操纵会自动连结挨次,,就像挪用了AsOrdered。
var res = arr.AsParallel().OrderBy(i => i).Where(i => i != 3);
功效也是:1, 2, 4, 5了。
注意某些PLINQ要领如果没有连结挨次执行意义不大,好比Reverse要领:
var res = arr.AsParallel().Reverse();