如何并行启动List ?

我有一个返回System.Threading.Tasks.Task的对象:

 public class MyClass { public Task GetTask(object state, CancellationToken cancellationToken) { return new Task(Execute, state, cancellationToken); } public void Execute(object context) { //do stuff } } 

在其他地方我有一个List ,所以我执行以下操作来获取List

 var myTaskList = myClassList.Select(p => p.GetTask(null, cancellationToken)).ToList(); 

现在我有List ,如何并行启动它们? 是否有更简洁的方法来编码?

谢谢!

你是什​​么意思“并行启动它们”? 当你运行Task ,它在另一个线程上执行,所以你可能只是简单地说:

 foreach(var task in myTaskList) { task.Start(); } 

但是如果你有这么多的想要将起始逻辑移动到另一个线程,你可以在另一个线程/任务中调用上面的代码(我使用List.ForEach来获得更短的代码)。

 Task.Factory.StartNew(() => myTaskList.ForEach(task => task.Start())); 

或者您可以使用TPL的Parallel.ForEach 。 这仍将阻止执行线程,直到所有任务都启动,但它将在内部线程池上执行启动操作,因此对于大量项目和一些空闲CPU核心/线程,它可能会大大加快启动速度。

 Parallel.ForEach(myTaskList, task => task.Start()); 

我可能会误解你的问题,但这不仅仅是在每项任务上调用Start吗?

 foreach(Task task in myTaskList) { task.Start(); } 

等待所有任务完成:

 Task.WaitAll(myTaskList.ToArray());