我有一个外部单线程程序,需要使用不同的参数运行数百次。为了让它更快,我想同时为每个核心运行一次。为此,我使用 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);
非常感谢!
关于c# - Parallel.ForEach 停止为最后几个项目并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104771/