Comment puis-je attendre que le Parallel.ForEach se termine

122

J'utilise TPL dans mon projet actuel et j'utilise Parallel.Foreach pour faire tourner de nombreux threads. La classe Task contient Wait () pour attendre que la tâche soit terminée. Comme ça, comment puis-je attendre que Parallel.ForEach se termine, puis passer à l'exécution des instructions suivantes?

VJAI
la source

Réponses:

193

Vous n'avez rien à faire de spécial, Parallel.Foreach()attendez que toutes ses tâches ramifiées soient terminées. Depuis le thread appelant, vous pouvez le traiter comme une seule instruction synchrone et, par exemple, l'envelopper dans un try / catch.

Henk Holterman
la source
10
"Parallel.Foreach () attendra que toutes ses tâches branchées soient terminées" il peut être confondu dans certaines situations, comme (tâche asynchrone à l'intérieur): Parallel.ForEach (groupedUnreadMessages, async uneadMsgCollection => {/ * fonctionne * /});
Bo HU du
voici un autre problème dans stackoverflow: stackoverflow.com/questions/11564506/…
Bo HU
4
Cette réponse date de 2011, avant async / await. Mais comme je l'ai dit, générer des threads dans ForEach n'est pas une bonne idée. Une action asynchrone n’est pas non plus. Les liens que vous avez publiés fournissent de bonnes informations et des solutions.
Henk Holterman
1
"générer des threads dans le ForEach n'est pas une bonne idée" pouvez-vous développer? Est-ce "à moins que vous ne vous assuriez d'attendre avant de revenir"?
Gianthra
16

Vous n'en avez pas besoin avec Parallel.Foreach: il n'exécute le foreach que dans autant de threads qu'il y a de processeurs disponibles, mais il retourne de manière synchrone.

Plus d'informations peuvent être trouvées ici

Louis Kottmann
la source