2010-09-08 6 views
4

Y a-t-il un moyen plus court d'attendre la fin de plusieurs threads? Peut-être utiliser ContinueWhenAll ... mais je ne veux pas exécuter le reste de mon code async.Attente de l'achèvement de toutes les tâches à l'aide de la bibliothèque parallèle de tâches dans .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. 

Répondre

12

Si vous remplacez la boucle for() avec Parallel.For() ou Parallel.ForEach() vous n'avez pas besoin d'une liste de tâches ou quoi que ce soit. Je ne sais pas pourquoi vous voudriez un .WaitAll() après un ForEach, ne semble même pas nécessaire.

Les boucles parallèles s'arrêtent lorsque toutes les tâches sont terminées.

+0

Je veux m'assurer que tous les objets sont finis de traitement avant de continuer avec les appels DoSomeSync. –

+0

@Jeff: Oui, je le pensais. Un Parallel.For() n'a pas besoin de WaitAll. –

+0

Je vois ce que vous voulez dire maintenant - y a-t-il une page qui documente cela? Je n'ai pas pu en trouver. –

Questions connexes