Parallel.ForEach在最后几项中停止平行

本文关键字:几项 ForEach 最后 Parallel | 更新日期: 2023-09-27 18:00:25

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

有人能向我解释一下这种行为吗?任何提示或提示都将不胜感激!

Parallel.ForEach在最后几项中停止平行

根据Scott在上面评论中的提示,将其更改为以下代码,使其行为符合我的要求:

OrderablePartitioner<ParamType> partitioner =
    Partitioner.Create(ListWithAllTheParams, EnumerablePartitionerOptions.NoBuffering);
var parallelOptions = new ParallelOptions {
    MaxDegreeOfParallelism = Environment.ProcessorCount // 8 for me
};
Parallel.ForEach(partitioner, parallelOptions, DoTheStuff);

非常感谢!