c# - Parallel.ForEach 停止为最后几个项目并行

标签 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)项填充参数列表时,这不会发生。

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

最佳答案

根据上面评论中 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/

相关文章:

java - 无法生成有效的网页。引用

c# - 如何删除.net 2.0后面代码中的css类

.NET Windows Forms 自定义控件,如何创建快捷菜单

bash - 如何并行运行来自不同目录的 2 个或更多脚本

c# - 根据 Linq 查询中的属性值过滤掉重复的 XElement

c# - 如何将 zip 文件发送到 ASP.NET WebApi

algorithm - 任何分布式并行树搜索算法建议?

c++ - 改进并行计算的内存布局

c# - ASP.NET MVC UrlHelper.Action() 没有返回正确的路径

c# - Monogame 模棱两可的 Vector2