// 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等?
答案 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)
似乎运行时正在查看您要使用多少个线程并将工作负载分成多个。例如第一个线程正在处理数据集的前半部分,第二个线程正在处理数据的后半部分。