AsParallel的最大并行度()

使用Parallel.ForEach我们可以选择定义Parallel选项并设置Max Degree of Parallelism,如:

 Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > { // Do Work }) 

但在做PLINQ时:

 Tabel.AsEnumberable() .AsParallel() .Where(//Logic) 

我无法找到设置MaxDegreeOfParallelism 。 我也在网上抬头,但没有找到任何东西。 有没有人找到解决这个问题的方法? 任何帮助表示赞赏。

您可以使用ParallelEnumerable.WithDegreeOfParallelism

设置要在查询中使用的并行度。 并行度是将用于处理查询的并发执行任务的最大数量。

 var result = Tabel.AsEnumberable() .AsParallel() .WithDegreeOfParallelism(number) .Where(/* predicate */); 

编辑:

@svick提供了一个优秀的ParallelOptions.MaxDegreeOfParallelism和PLINQ的WithDegreeOfParallelism ,它强调了两者之间的区别:

并行工作使用了我们称之为复制任务的隐藏概念。 概念是循环将从一个用于处理循环的任务开始,但如果有更multithreading可用于协助处理,则将创建其他任务以在这些线程上运行。 这使得能够最小化资源消耗。 鉴于此,说明ParallelOptions启用DegreeOfParallelism的规范是不准确的,因为它实际上是最大程度的 :循环以1度开始,并且可以向上达到指定为资源可用的任何最大值。

PLINQ不同。 PLINQ中的一些重要的标准查询运算符需要在查询处理中涉及的线程之间进行通信,包括一些依赖于屏障以使线程能够以锁定步骤操作的线程。 PLINQ设计要求为查询积极参与特定数量的线程以取得任何进展。 因此,当您为PLINQ指定DegreeOfParallelism时,您将指定将涉及的实际线程数,而不仅仅是最大值。

是的,你当然可以做到这一点。 您只需使用WithDegreeOfParallelism扩展方法

 yourSequence.AsParallel() .WithDegreeOfParallelism(5)//Whatever number as you like .Where(...); 
 .AsParallel() .WithDegreeOfParallelism(n) .Where(x=>)