如何并行启动List <task>?</task>

时间:2012-12-12 10:26:14

标签: c# task-parallel-library

我有一个返回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<MyClass>,所以我执行以下操作以获得List<Task>

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

既然我有List<Task>,我怎么能并行启动它们?是否有更简洁的方法对此进行编码?

谢谢!

2 个答案:

答案 0 :(得分:26)

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

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

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

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

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

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

答案 1 :(得分:6)

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

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

等待所有任务完成:

Task.WaitAll(myTaskList.ToArray());