PLinq
如何将Linq转换为PLinq
var nums = Enumerable.Range(0,100);
var query = from n in nums
select new
{
thread = Thread.CurrentThread.ManagedThreadId,
num = n
};
foreach (var item in query)
{
Console.WriteLine(item);
}
输出结果如下,说明linq使用的是单线程执行:
AsParallel
AsParallel()可以将串行执行改为并行执行
将var query = from n in nums
改为var query = from n in nums.AsParallel()
此时输出结果,说明是多线程并行执行。
AsOrdered
AsOrdered()就是将并行结果还是按照未排序的样子进行排序
【10000,1,2,3,4】 =>并行计算 asOrdered => [10000,1,2,3,4]
【10000,1,2,3,4】 =>串行计算 Orderby => [1,2,3,4,10000]
将var query = from n in nums
改为var query = from n in nums.AsParallel().AsOrdered()
可以看到原数组为【10000,1,2,。。。99】,执行也是按原数组顺序执行。而不加AsOrdered()时输出是打乱原先顺序的。如AsParallel时的输出结果。
顾名思义,AsUnordered与其相反:不按照原始顺序排序。
AsSequential
AsSequential与AsParallel是相对相反的。其功能是将Plinq转为Linq。
Plinq底层都是用Task的,基于Task的一些编程模型,让我们快速进行并行计算用的。
WithDegreeOfParallelism
设置Plinq当前需要使用线程的数量。
var query = from n in nums.AsParallel().WithDegreeOfParallelism(2)
WithCancelLation
var query = from n in nums.AsParallel().WithCancellation(source.Token)
如果执行之前被取消,那就不要执行了
WithExecutionMode
var query = from n in nums.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism)
此参数可以告诉系统当前是否强制并行。
WithMergeOptions
var query = from n in nums.AsParallel().WithMergeOptions()
Plinq主要是划分区块,然后对区块进行聚合计算,从而达到分而治之。
WithMergeOptions通过枚举选择使用什么类型的缓冲区。