如何启动一个列表 在平行下?(How to start a List in par

2019-07-05 01:06发布

我有一个返回一个对象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> ,我怎么能开始他们都在并行? 有没有更简洁的方式实现代码?

谢谢!

Answer 1:

你说的“并行启动它们”是什么意思? 当您运行的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());


Answer 2:

我可能会误解你的问题,但不只是为了呼吁每个任务开始?

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

等待所有任务完成:

Task.WaitAll(myTaskList.ToArray());


文章来源: How to start a List in parallel?