[英]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.