2011-09-29 28 views
3
// 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 ...是否可以在Parallel.For中定义执行顺序?

如果我有14个参数,并2个许可证总是推出1 & 8,后2 & 9 ...

是否有可能定义顺序为:先1 & 2,后3 & 4等?

+0

如果您有订单依赖关系,则需要使用continuations。 –

+0

@Sven这不是必要的,但会有用 - 在这里它将是offtopic – Saint

回答

6

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

+0

ExternalProgram(i)需要很多时间,所以我需要多线程。有时我有更多的免费许可证。并且顺序不是必须的,但是会很有用 – Saint

+0

@Saint,并且可以使用带有''ContinueWith''的'Task'(http://msdn.microsoft.com/en-us/library/system.threading.tasks.task .continuewith.aspx)在线程完成其工作后运行一些序列? – 0x49D1

+1

您可以使用Queue作为Items的顺序,以及多个正在从此Queue请求其Items的线程。所以你可以决定可能的线程和顺序。请不要忘记锁定对队列的访问权限。 – oberfreak

1

这听起来像你威力要使用Parallel.ForEachcustom partitioner,而不是 - 但不要忘记,它不是真正做“1 & 6,然后2 & 7” - 它做(说)1上线1 ,线程2上6,线程2上7,等等。它不会启动这样的进程。

如果要启动的程序组,你应该对这些群体进行分组自己,然后循环串联,只提供集团内并行,通过指定并行等于最大程度组大小。

0

如果你可以切换到使用一个ForEach(已经生成的数字范围,也许,使用IEnumerable.Range后),可以使用,需要一个Partitioner<T>的重载之一。第三个链接包含一次提供单个元素的示例分区程序。

0

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

9

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

+0

对不起,在评论后看到您的答案...对不起!为它+1 ;-) – oberfreak

相关问题