我们希望选择性地控制并行循环上的“线程”数量,以避免使 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/