我在Console App中有一个List<Task>
(或List<Action>
用于Run()方法)。假设我不使用TPL但我使用以下代码。
myTasks.ForEach (t => t.Start());
OR
myActions.ForEach(a => Task.Run(a));
上述哪一项将并行运行任务。他们中的任何一个或两个都会像TPL那样透明地处理CPU内核之间的负载平衡吗?
如果上面的代码执行了并行工作,那么TPL会在哪里进行?
答案 0 :(得分:2)
以上哪一项会并行运行任务?
Task
没有Run
方法。当您将委托传递给Start
时,它只有new Task
方法,您不应该使用该方法。请改用Task.Run
。
他们中的任何一个或两个都会透明地处理CPU内核之间的负载平衡
两者都在线程池线程上执行给定的委托,它们都不会决定它们执行哪个核心。这仅由底层OS系统管理。
Theres a great article关于并发的长度:
Worker ThreadPool:工作者ThreadPool旨在提供CPU并行级别的服务,利用多核架构。 CPU并行性有两个主要考虑因素:快速和最佳地调度工作;并且限制并行度。对于前者,ThreadPool实现使用诸如无锁队列之类的策略来避免争用和工作窃取以实现负载平衡。