根据微软(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,一直是 增强了算法(如爬山),确定和 调整到最大化吞吐量的线程数。这使得 任务相对轻量级,你可以创建其中的许多 实现细粒度并行。为了补充这一点,广为人知 工作窃取算法用于提供负载平衡。
答案 0 :(得分:4)
This blog post应该回答你的一些问题。
简短的回答:使用Tasks,您必须在主线程上执行Task :: WaitAll(...),以防止退出,因为Parallel :: Invoke将为您实际处理此问题。除此之外,没有其他因为在Parallel :: Invoke下使用相同的TPL基础设施。