运行时更改Parallel.ForEach MaxDegreeOfParallelism?

时间:2018-05-06 03:22:27

标签: c# multithreading parallel.foreach

假设我的代码中运行Parallel.ForEachParallelOption MaxDegreeOfParallelism设置为Utils.Threads(),就像这样:

Parallel.ForEach(linesList, new ParallelOptions { MaxDegreeOfParallelism = Utils.Threads() }, line => ...

现在假设Utils.Threads()返回1到10之间的随机整数。

MaxDegreeOfParallelismParallel.ForEach运行时会发生变化,还是会一直设置为第一次Utils.Threads()来电?提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

当我的Parallel.ForEach运行时MaxDegreeOfParallelism会改变,还是会一直设置为第一个Utils.Threads()调用?提前谢谢。

不,它不会,因为它不会继续检查和修改指定的值,这在API初始化期间是必需的。事实上,如果您查看MaxDegreeOfParallelism

的签名
public int MaxDegreeOfParallelism { get; set; }

因为它的值类型不是引用类型,它的integer,所以在任何情况下,值都被复制,它永远不会引用值的任何变化,值类型的标准行为

  

MaxDegreeOfParallelismParallel.ForEach电话

的影响

它是一个指标或提示,它不能确保在执行开始之前从池中配置许多并行线程。对于Parallel.ForEach,它始终以单线程开始,并且根据任务的数量和所花费的时间,继续追加并行执行的能力。 此值也是内部审核的,并非您可以提供非常高的值并期望配置许多线程。它虽然在PLinq的情况下表现不同,但在处理之前它会预期大多数线程被供应/初始化,但如果每个线程的工作量不够,它会对性能产生不利影响,由于上下文切换

关于C#Parallel / PLinq API中的DOP的几个引用链接:

When to set the max degree of parallelism

Max Degree of Parallelism for AsParallel()