C#多线程学习笔记九

如何将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通过枚举选择使用什么类型的缓冲区。

猜你喜欢

转载自blog.csdn.net/Z960515/article/details/113441534