Parallel.ForEach停止与最后几个项目并行

时间:2015-06-28 21:07:49

标签: c# .net parallel-processing

我有一个外部单线程序,需要使用不同的参数运行数百次。为了加快速度,我希望同时为每个核心运行一次。为此,我使用在具有不同参数的列表上运行的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个)项填充参数列表时,不会发生这种情况。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

Parallel.ForEach(partitioner, parallelOptions, DoTheStuff);

非常感谢!