如何并行启动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
来获得更短的代码)。
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());