Как запустить список <Задач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>, как я могу запустить их все параллельно? Есть ли более сжатый способ кодировать это?

Спасибо!

Ответ 1

Что вы подразумеваете под "началом их параллельно"? Когда вы запускаете Task, он выполняется в другом потоке, поэтому вы, вероятно, имеете в виду просто:

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

Но если у вас есть так много из них, что вы хотите переместить исходную логику в другой поток, вы можете либо вызвать вышеуказанный код в другой поток/задачу (я использую List<T>.ForEach для более короткого кода).

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

Или вы можете использовать TPL Parallel.ForEach. Это все равно блокирует исполняемый поток до тех пор, пока не будут запущены все Задачи, но он выполнит действие запуска во внутреннем потоковом пуле, поэтому для большого количества элементов и некоторых свободных ядер или потоков ЦП он может значительно ускорить запуск.

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

Ответ 2

Возможно, я не понимаю ваш вопрос, но не стоит ли просто называть Start на каждой задаче?

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

Ожидание завершения всех задач:

Task.WaitAll(myTaskList.ToArray());