Подтвердить что ты не робот

Ожидание списка задач

Я пытаюсь сделать что-то вроде этого:

foreach (var o in ObjectList) 
{ 
    CalculateIfNeedToMakeTaskForO(o);

    if (yes) 
        TaskList.Add(OTaskAsync());
}

Теперь я хотел бы дождаться завершения всех этих задач. Помимо выполнения

foreach(var o in ObjectList)
{
    Result.Add("result for O is: "+await OTaskAsync());
}

Я могу что-нибудь сделать? (лучше, более элегантно, более "правильно" )

4b9b3361

Ответ 1

Вы ищете Task.WaitAll (предполагая, что ваш TaskList реализован IEnumerable<Task>)

Task.WaitAll(TaskList.ToArray());

Изменить: Так как WaitAll принимает только массив задач (или список Task в форме массива переменных массива), вам нужно преобразовать свой Enumerable. Если вы хотите использовать метод расширения, вы можете сделать что-то вроде этого:

pulic static void WaitAll(this IEnumerable<Task> tasks) 
{
    Task.WaitAll(tasks.ToArray());
}

TaskList.WaitAll();

Но это действительно только синтаксический сахар.

Ответ 2

Вы ищете Task.WhenAll:

var tasks = ObjectList
    .Where(o => CalculateIfNeedToMakeTaskForO(o))
    .Select(o => OTaskAsync(o))
    .ToArray();
var results = await Task.WhenAll(tasks);
var combinedResults = results.Select(r => "result for O is: " + r);