繁体   English   中英

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

[英]Task Parallelism (TPL) and Task Scheduling in C#

据微软( 链接 ),有两种方法来启动一个任务:

假设我在主线程中创建了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中执行4个任务时,它们的调度方式是否完全相同?

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

在后台,任务被排队到ThreadPool中,该线程池已通过算法(例如爬山)进行了增强,该算法确定并调整了线程数量以最大化吞吐量。 这使任务相对轻量,您可以创建许多任务以启用细粒度的并行性。 为了补充这一点,采用了广为人知的工作窃取算法来提供负载平衡。

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

简短的答案:使用Tasks,您将必须在主线程上执行Task :: WaitAll(...),以防止退出Parallel :: Invoke会真正为您处理的地方。 除此之外,别无其他,因为在Parallel :: Invoke下使用了相同的TPL基础结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM