2010-09-08 1 views
4

Есть ли более короткий способ подождать, пока закончится несколько потоков? Возможно, используя ContinueWhenAll ... но я не хочу запускать оставшуюся часть моего асинхронного кода.Ожидание выполнения всех задач с использованием параллельной библиотеки задач в .NET 4.0

List<object> objList = // something 

List<Task> taskHandles = new List<Task>(); 
for(int i = 0; i < objList.Count; i++) { 

    taskHandles.Add(Task.Factory.StartNew(() => { Process(objList[i]); })); 

} 

foreach(Task t in taskHandles) { t.Wait(); } 

DoSomeSync1(); 
.. 
DoSomeSync2(); 
.. 
DoSomeSync3(); 
.. 

// I could have used ContinueWhenAll(waitHandles, (antecedent) => { DoSomeSync...; }); 
// but I'd rather not have to do that. 
// It would be nice if I could have just done: 

Parallel.ForEach(objList, (obj) => { Process(obj); }).WaitAll(); 

// or something like that. 

ответ

12

Если заменить петлю for() с Parallel.For() или Parallel.ForEach() вам не нужен список задач или что-нибудь. Я не уверен, зачем вам нужен .WaitAll() после ForEach, даже не кажется необходимым.

Параллельные циклы останавливаются, когда выполняются все Задачи.

+0

Я хочу, чтобы все объекты были обработаны до продолжения вызовов DoSomeSync. –

+0

@Jeff: Да, я так и думал. Параллельно.For() не требуется WaitAll. –

+0

Я понимаю, что вы сейчас имеете в виду - есть ли какая-то страница, которая документирует это? Я не мог найти. –

 Смежные вопросы

  • Нет связанных вопросов^_^