C # TPL, как узнать, что все задачи выполнены? - PullRequest
8 голосов
/ 21 февраля 2011

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

Код:

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

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

Ответы [ 3 ]

23 голосов
/ 21 февраля 2011

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

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

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

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

13 голосов
/ 21 февраля 2011
var allTasks = new List&ltTask&gt();
foreach (Entity a in AAAA)
{
  // create the task 
  task = new Task(() => {
    myMethod(a);
  },  Token, TaskCreationOptions.None);

  // Add the tasks to a list
  allTasks.Add(task);
  task.Start();
}

// Wait until all tasks are completed.
Task.WaitAll(allTasks.ToArray());
8 голосов
/ 21 февраля 2011

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

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

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

...