2011-10-25 18 views
78

Sto utilizzando TPL nel mio progetto corrente e utilizzo Parallel.Foreach per far girare molti thread. La classe Task contiene Wait() per attendere che l'attività venga completata. In questo modo, come posso aspettare che Parallel.ForEach sia completato e poi andare all'esecuzione delle prossime dichiarazioni?Come posso attendere fino al completamento di Parallel.ForEach

risposta

132

Non devi fare nulla di speciale, Parallel.Foreach() attenderà fino a quando tutte le sue attività ramificate sono complete. Dal thread chiamante puoi trattarlo come una singola istruzione sincrona e, ad esempio, racchiuderlo all'interno di un try/catch.

+2

"Parallel.ForEach() attenderà fino a quando tutti i suoi compiti ramificati sono complete" può essere confuso in qualche situazione, come (attività asincrone all'interno): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /}); –

+0

qui ci sono altri problemi nello stackoverflow: http://stackoverflow.com/questions/11564506/nesting-await-in-parallell-foreach –

+1

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

11

Non è necessario con Parallel.Foreach: esegue solo il foreach in quante thread sono disponibili i processori, ma restituisce in modo sincrono.

Maggiori informazioni possono essere trovate here

+9

Il numero (massimo) di thread che utilizza non è così semplice. –

Problemi correlati