MaxDegreeOfParallelism

MaxDegreeOfParallelism

我们希望选择性地控制并行循环上的“线程”数量,以避免使 Web 服务不堪重负(例如)。

是否可以在 MaxDegreeOfParallelism 循环上指定自定义 Parallel.ForEach,但也可以根据需要恢复为默认值?看似零 (0) 是 MaxDegreeOfParallelism 的无效值,而我希望它可以简单地表示“忽略”。

换句话说,你能避免编写这种类型的代码吗?

int numParallelOperations = GetNumParallelOperations();
if (numParallelOperations > 0)
{
 ParallelOptions options = new ParallelOptions();
 options.MaxDegreeOfParallelism = numParallelOperations;
 Parallel.ForEach(items, options, i =>
 {
   Foo(i);
 });
}
else
{
 Parallel.ForEach(items, i =>
 {
   Foo(i);
 });
}

最佳答案

你的意思是根据 MSDN-1 :



您可以像这样控制 近似 线程数:

// use only (ca) one kernel:
int degreeOfParallelism = 1;
// leave (ca) one kernel idle:
int degreeOfParallelism = Environment.ProcessorCount - 1;
// use (ca) half of the kernels:
int degreeOfParallelism = Environment.ProcessorCount > 1 ?
                          Environment.ProcessorCount / 2 : 1;
// run at full speed:
int degreeOfParallelism =  - 1;

var options = new ParallelOptions();
options.MaxDegreeOfParallelism = degreeOfParallelism;

Parallel.For(0, x, options, y =>
//...

关于c# - 在 Parallel.ForEach 中指定默认 MaxDegreeOfParallelism?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27538057/

10-11 10:31