Come posso aspettare fino al completamento di Parallel.ForEach


122

Sto usando TPL nel mio progetto corrente e utilizzo Parallel.Foreach per girare molti thread. La classe Task contiene Wait () per attendere il completamento dell'attività. In questo modo, come posso aspettare il completamento di Parallel.ForEach e poi passare all'esecuzione delle istruzioni successive?

Risposte:


193

Non devi fare nulla di speciale, Parallel.Foreach()aspetterà fino al completamento di tutte le sue attività ramificate. Dal thread chiamante puoi trattarlo come una singola istruzione sincrona e ad esempio racchiuderlo in un try / catch.


10
"Parallel.Foreach () aspetterà fino al completamento di tutte le sue attività ramificate" può essere confuso in alcune situazioni, come (attività asincrona all'interno): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /});
Bo HU

ecco un altro problema in stackoverflow: stackoverflow.com/questions/11564506/…
Bo HU

4
Questa risposta è del 2011, prima di async / await. Ma come ho detto, generare thread all'interno di ForEach non è una buona idea. Nessuna delle due è un'azione asincrona. I link che hai pubblicato forniscono buone informazioni e soluzioni.
Henk Holterman

1
"generare thread all'interno di ForEach non è una buona idea" puoi espandere? È "a meno che non ti assicuri di aspettare prima di tornare"?
Gianthra

16

Non ne hai bisogno con Parallel.Foreach: esegue il foreach solo in tanti thread quanti sono i processori disponibili, ma restituisce in modo sincrono.

Ulteriori informazioni possono essere trovate qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.