С# TPL, как узнать, что все задачи выполнены?

У меня есть цикл, который генерирует задачи.

Код:

Task task = null;
foreach (Entity a in AAAA)
{
  // create the task 
  task = new Task(() => {
    myMethod(a);
  },  Token, TaskCreationOptions.None);
  task.Start();
}

Как видите, в каждой итерации объект задачи имеет новую инициализацию (..new Task(() =>..) Как узнать, что все задачи выполнены?


person Yara    schedule 21.02.2011    source источник


Ответы (3)


Если вы замените это на

 Parallel.ForEach(...,  () => myMethod(a), ...)

Затем вы получаете автоматическое ожидание для всех задач в конце ForEach.

И, возможно, запустить ForEach из отдельной задачи.

person Henk Holterman    schedule 21.02.2011
comment
Ударь меня. Хотел бы я проголосовать несколько раз. Это ведь хороший пример не изобретать велосипед - person Rune FS; 21.02.2011
comment
Дело в том, что между циклом, создающим задачи, и Parallel.ForEach есть некоторые очень серьезные проблемы с производительностью. Хотя во многих случаях они могут быть похожими, их не следует слепо заменять друг другом для решения несвязанных проблем. - person Andrew Anderson; 23.02.2011
comment
@Андрей, ты прав. Я просто моргнул из-за неспецифического «моего метода(а)» и отсутствия информации об обстоятельствах. - person Henk Holterman; 23.02.2011

Вам нужно будет сохранить ссылки на все задачи, созданные в цикле. Затем вы можете использовать метод Task.WaitAll (см. справку MSDN). Вы можете либо создать массив и назначить задачи элементам массива (в С# 2.0), либо использовать LINQ:

var tasks = 
   AAAA.Select((Entity a) => 
      Task.Factory.StartNew(() => { myMethod(a); },
         Token, TaskCreationOptions.None)).ToArray();
Task.WaitAll(tasks)

Если вам не нужно использовать задачи (явно), то предложение Хенка использовать Parallel.ForEach, вероятно, является лучшим вариантом.

person Tomas Petricek    schedule 21.02.2011

person    schedule
comment
Аккуратно - я думаю, вам нужно ввести список List<Task>, чтобы .ToArray() генерировал массив задач, а не объектов - person Rup; 21.02.2011