在Parallel.ForEach中指定默认的MaxDegreeOfParallelism?

Pet*_*erX 3 c# parallel-processing multithreading task-parallel-library

我们希望可选地控制并行循环中"线程"的数量,以避免压倒Web服务(例如).

是否可以MaxDegreeOfParallelismParallel.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);
 });
}
Run Code Online (Sandbox Code Playgroud)

TaW*_*TaW 5

你的意思-1是按照MSDN:

MaxDegreeOfParallelism将通过此ParallelOptions实例传递的并行方法调用运行的并发操作数限制为设置值(如果为正数).如果MaxDegreeOfParallelism为-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 => 
//...
Run Code Online (Sandbox Code Playgroud)

  • 接下来的问题是,-1与未设置选项相同吗? (4认同)
  • 是的。根据我的理解,您希望统一通话。不?- 您可能还需要其他成员的 [选项](http://msdn.microsoft.com/de-de/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism%28v=vs.110%29.aspx),例如`CancellationToken`.. (2认同)