更改 Parallel.ForEach MaxDegreeOfParallelism 而 运行?

Change Parallel.ForEach MaxDegreeOfParallelism while running?

假设我的代码中有一个 Parallel.ForEach 运行,其中 ParallelOption MaxDegreeOfParallelism 设置为 Utils.Threads(),就像这样:

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

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

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

Will the MaxDegreeOfParallelism change while my Parallel.ForEach is running, or will it be set to the first Utils.Threads() call for all the time ? Thanks in advance.

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

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

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

Impact of MaxDegreeOfParallelism on Parallel.ForEach call

它是一个指示器或提示,它不能确保在执行开始之前从池中提供许多并行线程。对于 Parallel.ForEach,它总是从单线程开始,并根据任务的数量和所花费的时间不断增加并行执行的能力。 这个值也是内部调节的,并不是说你可以提供一个非常高的值并期望提供很多线程。它虽然在 PLinq 的情况下表现不同,在处理之前它会期望大多数线程被配置/初始化,但它可能会对性能产生不利影响,如果每个线程都没有足够的工作,由于上下文切换

几个参考链接,关于 C# Parallel/PLinq 中的 DOP API:

When to set the max degree of parallelism

Max Degree of Parallelism for AsParallel()