2012-02-08 38 views
1

据微软(link),有两种方法来启动一个任务:明确任务并行(TPL)和任务调度在C#

假设我在主线程中创建了4个不同的任务,分别称为task1,task2,task3和task4。

案例1:我跑所有这些,明确在主线程:

task1.Start(); 
task2.Start(); 
task3.Start(); 
task4.Start(); 

案例2:我运行它们隐含使用Parallel.Invoke方法在主线程:

Parallel.Invoke(task1, task2, task3, task4); 

的我注意到的唯一区别是在case2中,主线程暂停,直到Invoke()返回。

我的问题是关于任务调度程序。 在调度方面,它们在case1和case2中的行为有4个不同的任务吗?它们是完全等价的吗?

在我上面我们已经提到的相同链接

阅读:

在后台,任务排队到线程池,这一直是 加强与算法(如爬山)决定和 调整最大化吞吐量的线程数量。这使得 任务相对轻量级,并且您可以创建其中的许多任务来启用细粒度并行。为了补充这一点,采用广为人知的工作窃取算法来提供负载平衡。

+0

这是好奇还是你有一些代码依赖于这些信息? – Tudor 2012-02-08 15:50:35

+0

是的。它出于好奇。我没有找到任何参考,所以我决定发布这个看看是否有人可以给我一个提示。 – ManiAm 2012-02-08 17:43:03

回答

4

This blog post来自Parallel团队应回答您的一些问题。

简短的回答:任务你必须在你的主线程上执行一个Task :: WaitAll(...)来防止退出,因为Parallel :: Invoke实际上会为你处理这个问题。除此之外,没有别的,因为在Parallel :: Invoke下使用了相同的TPL基础结构。

+0

是的。由于任务的线程是后台,我们必须阻塞主线程(例如使用WaitAll)并等待它们完成,否则它们会突然终止。 我同意,在Invoke中使用相同的TPL基础结构。从这张照片可以看出: http://dl.dropbox.com/u/5153771/ParallelProgramming.png。 但这是否意味着它们在调度方面是等价的?谢谢你的答案和伟大的博客文章。 – ManiAm 2012-02-09 10:29:10

+0

在这两种情况下都使用相同的任务调度程序 – 2012-02-09 14:10:28