我有一个外部单线程程序,需要使用不同的参数运行数百次。为了使其更快,我想同时为每个内核运行一次。为此,我使用在具有不同参数的列表上运行的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);


非常感谢!

10-04 14:28