AsParallel的最大并行度()

cod*_*ate 25 .net c# plinq task-parallel-library parallel.foreach

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

Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > {
    // Do Work
})
Run Code Online (Sandbox Code Playgroud)

但在做PLINQ时:

Tabel.AsEnumberable()
     .AsParallel()
     .Where(//Logic)
Run Code Online (Sandbox Code Playgroud)

我无法找到一种方法来设置MaxDegreeOfParallelism.我也在网上抬头,但没有找到任何东西.有没有人找到解决方法呢?任何帮助表示赞赏.

Yuv*_*kov 48

你可以使用ParallelEnumerable.WithDegreeOfParallelism:

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

var result = Tabel.AsEnumberable()
                  .AsParallel()
                  .WithDegreeOfParallelism(number)
                  .Where(/* predicate */);
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

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

  • 您可能还想阅读[*ParallelOptions.MaxDegreeOfParallelism vs PLINQ的WithDegreeOfParallelism*](http://blogs.msdn.com/b/pfxteam/archive/2009/05/29/9655514.aspx)两者之间的差异. (4认同)

Sri*_*vel 8

是的,你当然可以这样做.您只需使用WithDegreeOfParallelism扩展方法

yourSequence.AsParallel()
    .WithDegreeOfParallelism(5)//Whatever number as you like
    .Where(...);
Run Code Online (Sandbox Code Playgroud)