Pet*_*erX 3 c# parallel-processing multithreading task-parallel-library
我们希望可选地控制并行循环中"线程"的数量,以避免压倒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);
 });
}
你的意思-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 => 
//...
| 归档时间: | 
 | 
| 查看次数: | 13513 次 | 
| 最近记录: |