Ожидание завершения всех задач с использованием библиотеки параллельных задач в .NET 4.0 - PullRequest
4 голосов
/ 08 сентября 2010

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

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.

1 Ответ

12 голосов
/ 08 сентября 2010

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

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

...