Wie kann ich warten, bis Parallel.ForEach abgeschlossen ist?

122

Ich verwende TPL in meinem aktuellen Projekt und Parallel.Foreach, um viele Threads zu spinnen. Die Task-Klasse enthält Wait (), um zu warten, bis die Task abgeschlossen ist. Wie kann ich so warten, bis Parallel.ForEach abgeschlossen ist, und dann die nächsten Anweisungen ausführen?

VJAI
quelle

Antworten:

191

Sie müssen nichts Besonderes tun, sondern Parallel.Foreach()warten, bis alle verzweigten Aufgaben abgeschlossen sind. Über den aufrufenden Thread können Sie ihn als einzelne synchrone Anweisung behandeln und beispielsweise in einen try / catch-Code einschließen.

Henk Holterman
quelle
10
"Parallel.Foreach () wartet, bis alle verzweigten Aufgaben abgeschlossen sind" kann in einigen Situationen verwirrt sein, z. B. (asynchrone Aufgabe im Inneren): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /});
Bo HU
Hier ist ein weiteres Problem in Stackoverflow: Stackoverflow.com/questions/11564506/…
Bo HU
4
Diese Antwort stammt aus dem Jahr 2011, bevor async / await. Aber wie gesagt, das Laichen von Threads im ForEach ist keine gute Idee. Es handelt sich auch nicht um eine asynchrone Aktion. Die von Ihnen geposteten Links bieten gute Informationen und Lösungen.
Henk Holterman
1
"Das Laichen von Threads im ForEach ist keine gute Idee" können Sie erweitern? Ist das "es sei denn, Sie stellen sicher, dass Sie warten, bevor Sie zurückkehren"?
Gianthra
16

Bei Parallel.Foreach ist dies nicht erforderlich: Das foreach wird nur in so vielen Threads ausgeführt, wie Prozessoren verfügbar sind, es wird jedoch synchron zurückgegeben.

Weitere Informationen finden Sie hier

Louis Kottmann
quelle