是否可以在Parallel.For中定义执行顺序?

时间:2011-09-29 09:50:44

标签: c# multithreading .net-4.0 synchronization parallel-for

// 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等?

5 个答案:

答案 0 :(得分:10)

如何使用Queue / ConcurrentQueue并将并行循环体中的项目出列?这将确保保留订购。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

听起来你可能希望Parallel.ForEach使用custom partitioner而不是 - 但不要忘记它并没有真正做到“1& 6,然后2 & 7“ - 它在线程1上做(比如说)1,在线程2上做6,然后在线程2上做7,等等。它不会启动进程。

如果要启动进程组,您应该自己执行分组,然后循环遍历这些串联组,只提供组中的并行,通过指定最大并行度等于组大小。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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