初识Parallel Extensions之PLINQ
输出结果顺序
由于并行的原因输出结果可能和原有的数据在数据源中的顺序不一样,例如:
string[] words = new[] { "Welcome", "to", "Beijing","OK","Hua","Ying","Ni" ,"2008"};
var lazyBeeQuery = from word in words.AsParallel() select word;
foreach (string word in lazyBeeQuery)
{
Console.WriteLine(word);
}
这时的输出结果可能是:
Welcome
Hua
to
Ying
Beijing
Ni
OK
2008
如果我们希望输出结果和原有的数据在数据源中的顺序保持一致,可以使用AsParallel的带有ParallelQueryOptions.PreserveOrdering参数的重载版本,例如上例中就可以改成如下就可以使输出顺序和原有结构一致:
var lazyBeeQuery = from word in words.AsParallel(ParallelQueryOptions.PreserveOrdering) select word;
注意:1 ParallelQueryOptions.PreserveOrdering参数的使用对ForAll API不起作用(目前是这样,以后不知道是否会做改动)。
2 使用这个保留顺序的选项会影响查询的性能和扩展能力,因为PLINQ将从逻辑上在末尾增加一个排序操作,而排序是一个无法随处理器数量的增加而显著提高性能的运算符,所以要在必须的时候才用。
并发异常
在顺序执行LINQ的时候,任何异常都会停止后续查询的运行。但在PLINQ中,由于是并行运行的,某一线程产生了异常,系统会尝试尽快终止其他线程的运行,在所有线程关闭之后,产生的所有异常将会放到System.Threading.AggregateException中,你可以通过InnerExceptions属性来得到所有异常只读集合ReadOnlyCollection。