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

本文关键字:TPL 任务调度 并行性 任务 | 更新日期: 2023-09-27 18:23:58

根据Microsoft(链接),有两种方法可以启动任务:隐式显式

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

case1:我在主线程中显式地运行所有这些:

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

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

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

我注意到的唯一区别是,在case 2中,主线程挂起,直到Invoke()返回。

我的问题是关于任务调度程序。在调度方面,任务调度器在情况1和情况2中的4个任务的行为是否不同,或者它们完全等效?

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

在幕后,任务被排队到ThreadPool通过算法(如爬山)进行增强根据最大化吞吐量的线程数进行调整。这使得任务相对较轻,您可以创建许多任务实现细粒度并行。为了补充这一点,众所周知工作窃取算法被用来提供负载平衡。

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

Parallel团队的这篇博客文章应该会回答您的一些问题。

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