是否可以限制Parallel.ForEach的核心?

Kee*_*ker 41 .net c# parallel-processing foreach

Parallel.ForEach在我的代码中使用了一个.我的所有8个内核都达到了100%.这对于在服务器上运行的其他应用程序来说很糟糕.是否有可能将执行限制为4核心?

Flo*_*her 42

通过实例ParallelOptionsParallelOptions.MaxDegreeOfParallelism设置为4 Parallel.ForEach.

然而,这可能在其他机器上没有意义,这些机器可能拥有比您更多或更少的核心.通常,您应该让框架决定并行度.


Jon*_*eet 25

您可以在通过ParallelOptionsMaxDegreeOfParallelism设置为4财产.

  • 硬编码'4'不是一个好主意.`Environment.ProcessorCount/2`会做得更好. (7认同)
  • @Henk:这是硬编码2 :)我正在回答问题...确切地知道OP如何计算出他们想要多少核心在范围之外.(例如,你*可能*希望它变得平坦.) (7认同)
  • @Henk:这会在单核机器上遇到问题:) (4认同)
  • Environment.ProcessorCount`返回逻辑处理器的数量,而不是核心。这不是Kees所需要的。有关确定内核数的信息,请参见http://stackoverflow.com/questions/1542213/how-to-find-the-number-of-cpu-cores-via-net-c (2认同)

fub*_*ubo 13

以下是对其他答案不满意的人的一些代码

List<int> iList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };

System.Threading.Tasks.ParallelOptions opt = new System.Threading.Tasks.ParallelOptions();
opt.MaxDegreeOfParallelism = 4; // << here the maximum of 4 cores

System.Threading.Tasks.Parallel.ForEach<int>(iList, opt, i =>
{
    // do someting with parallelism 4
    Console.WriteLine(i);
});
Run Code Online (Sandbox Code Playgroud)