17

我有一个返回 a 的对象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>怎样才能并行启动它们?有没有更简洁的编码方式?

谢谢!

4

2 回答 2

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());
于 2012-12-12T10:33:53.663 回答
6

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

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

等待所有任务完成:

Task.WaitAll(myTaskList.ToArray());
于 2012-12-12T10:28:47.860 回答