6
// parameters.Count == 10
// actualFreeLicenses == 2
Parallel.For(0, parameters.Count, new ParallelOptions() 
                    {
                        MaxDegreeOfParallelism = actualFreeLicenses
                    }, i =>
                    {
                        ExternalProgram(i);
                    }
);

当我执行上面的代码时,我注意到i传递给ExternalProgram方法的值是 1 & 6,后来 2 & 7,后来 3 & 8 ...

如果我有 14 个参数和 2 个许可证,它总是启动 1 和 8,稍后启动 2 和 9 ...

是否可以定义顺序:前 1 和 2,后 3 和 4 等?

4

5 回答 5

12

在并行循环的主体中使用 Queue/ConcurrentQueue 和出列项目怎么样?这将确保保留顺序。

于 2011-09-29T10:15:07.640 回答
4

如果您使用并行,则它们的执行顺序无关紧要,因此是“并行”。如果订单与您相关,您应该使用顺序工作流程。

于 2011-09-29T09:54:11.243 回答
2

听起来您可能想改用Parallel.ForEach定义分区器-但不要忘记它并没有真正执行“1 & 6,然后是 2 & 7”-它在线程 1 上执行(例如)1,在线程 2 上执行 6,然后是线程 2 上的 7,等等。它不会像这样启动成对的进程。

如果要启动进程组,您可能应该自己执行分组,然后通过指定等于组大小的最大并行化程度来串行循环这些组,仅提供组内的并行性。

于 2011-09-29T09:56:21.537 回答
1

如果您可以切换到使用 a ForEach(在生成一系列数字之后,也许,使用IEnumerable.Range),您可以使用采用 a 的重载之一Partitioner<T>。第三个链接包括一个样本分区器,它一次提供一个元素。

于 2011-09-29T09:59:32.060 回答
1

运行时似乎正在查看您要使用多少线程并将工作负载划分为这些线程。例如,第一个线程正在处理数据集的前半部分,而第二个线程正在处理数据的后半部分。

于 2011-09-29T10:02:14.253 回答