Parallel.ForEach停止对最后几项进行平行处理

我有一个外部单线程程序,需要使用不同的参数运行数百次。 为了让它更快,我想同时为每个内核运行一次。 为此,我使用运行在具有不同参数的列表上的Parallel.ForEach传递给外部程序:

var parallelOptions = new ParallelOptions {
    MaxDegreeOfParallelism = Environment.ProcessorCount // 8 for me
};

Parallel.ForEach(ListWithAllTheParams, parallelOptions, DoTheStuff);

...

private void DoTheStuff(ParamType parameter, ParallelLoopState parallelLoopState, long index)
{
    // prepare process parameters etc.
    theProcess.Start();
    theProcess.WaitForExit();
}

非常简单,并且效果很好......直到最后~10个项目 - 由于某种原因,它们不会并行化,只是一个接一个地运行。 我已经通过查看任务管理器中的CPU使用情况和正在运行的程序来确认这一点。

只有少数(比如10个)项目填充参数列表时才会发生这种情况。

有人可以向我解释这种行为吗? 任何提示或提示表示赞赏!


在上述评论中Scott的提示将它改为下面的代码使其表现得如我所愿:

OrderablePartitioner<ParamType> partitioner =
    Partitioner.Create(ListWithAllTheParams, EnumerablePartitionerOptions.NoBuffering);

var parallelOptions = new ParallelOptions {
    MaxDegreeOfParallelism = Environment.ProcessorCount // 8 for me
};

Parallel.ForEach(partitioner, parallelOptions, DoTheStuff);

非常感谢!

链接地址: http://www.djcxy.com/p/50155.html

上一篇: Parallel.ForEach stops being parallel for the last few items

下一篇: C# parallel foreach equally finishing tasks