使用Parallel.ForEach
时,我们可以选择定义Parallel选项并设置最大并行度,如:
Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > {
// Do Work
})
但是在做PLINQ之类的时候:
Tabel.AsEnumberable()
.AsParallel()
.Where(//Logic)
我无法找到设置MaxDegreeOfParallelism
的方法。我也抬头看网,但没找到任何东西。有没有人找到解决方法呢?任何帮助表示赞赏。
答案 0 :(得分:41)
您可以使用ParallelEnumerable.WithDegreeOfParallelism
:
设置要在查询中使用的并行度。程度 parallelism是同时执行的任务的最大数量 将用于处理查询。
var result = Tabel.AsEnumberable()
.AsParallel()
.WithDegreeOfParallelism(number)
.Where(/* predicate */);
修改强>
@svick提供了一个很好的ParallelOptions.MaxDegreeOfParallelism vs PLINQ’s WithDegreeOfParallelism,它强调了两者之间的区别:
使用我们称之为复制任务的隐藏式概念并行工作。概念是循环将从一个用于处理循环的任务开始,但如果有更多线程可用于协助处理,则将创建其他任务以在这些线程上运行。这使得能够最小化资源消耗。 鉴于此,说明ParallelOptions启用DegreeOfParallelism的规范是不准确的,因为它实际上是一个最大程度:循环以1度开始,并且可以达到任何最大值指定为资源可用。
PLINQ与众不同。 PLINQ中的一些重要标准查询运算符需要在查询处理中涉及的线程之间进行通信,包括一些依赖于屏障以使线程能够以锁定步骤操作的线程。 PLINQ设计要求为查询积极参与特定数量的线程以取得任何进展。因此,当您为PLINQ指定DegreeOfParallelism时,您指定将涉及的实际线程数,而不仅仅是最大值。
答案 1 :(得分:8)
是的,你当然可以这样做。您只需使用WithDegreeOfParallelism扩展方法
即可yourSequence.AsParallel()
.WithDegreeOfParallelism(5)//Whatever number as you like
.Where(...);
答案 2 :(得分:0)
<IEnumerable>.AsParallel()
.WithDegreeOfParallelism(n)
.Where(x=>)