假设我的代码中运行Parallel.ForEach
,ParallelOption
MaxDegreeOfParallelism
设置为Utils.Threads()
,就像这样:
Parallel.ForEach(linesList, new ParallelOptions { MaxDegreeOfParallelism = Utils.Threads() }, line => ...
现在假设Utils.Threads()
返回1到10之间的随机整数。
MaxDegreeOfParallelism
在Parallel.ForEach
运行时会发生变化,还是会一直设置为第一次Utils.Threads()
来电?提前谢谢。
答案 0 :(得分:0)
当我的Parallel.ForEach运行时MaxDegreeOfParallelism会改变,还是会一直设置为第一个Utils.Threads()调用?提前谢谢。
不,它不会,因为它不会继续检查和修改指定的值,这在API初始化期间是必需的。事实上,如果您查看MaxDegreeOfParallelism
,
public int MaxDegreeOfParallelism { get; set; }
因为它的值类型不是引用类型,它的integer
,所以在任何情况下,值都被复制,它永远不会引用值的任何变化,值类型的标准行为
的影响
MaxDegreeOfParallelism
对Parallel.ForEach
电话
它是一个指标或提示,它不能确保在执行开始之前从池中配置许多并行线程。对于Parallel.ForEach
,它始终以单线程开始,并且根据任务的数量和所花费的时间,继续追加并行执行的能力。
此值也是内部审核的,并非您可以提供非常高的值并期望配置许多线程。它虽然在PLinq
的情况下表现不同,但在处理之前它会预期大多数线程被供应/初始化,但如果每个线程的工作量不够,它会对性能产生不利影响,由于上下文切换
关于C#Parallel / PLinq API中的DOP的几个引用链接: