C#中的任务并行(TPL)和任务调度

时间:2012-02-08 13:35:00

标签: c# multithreading task-parallel-library

根据微软(link)的说法,有两种方法可以启动任务:隐式明确

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

case1 :我在主线程中明确地运行它们:

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

case2 :我在主线程中使用Parallel.Invoke方法隐式运行它们:

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

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

我的问题是关于任务计划程序。 任务调度程序在case1和case2中的行为是否在调度方面有所不同,或者它们完全等效?

在我上面提到的同一个链接中,我们读到:

  

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

1 个答案:

答案 0 :(得分:4)

来自Parallel团队的

This blog post应该回答你的一些问题。

简短的回答:使用Tasks,您必须在主线程上执行Task :: WaitAll(...),以防止退出,因为Parallel :: Invoke将为您实际处理此问题。除此之外,没有其他因为在Parallel :: Invoke下使用相同的TPL基础设施。