¿Cómo puedo esperar hasta que se complete Parallel.ForEach?

122

Estoy usando TPL en mi proyecto actual y uso Parallel.Foreach para girar muchos hilos. La clase Task contiene Wait () para esperar hasta que se complete la tarea. De esta manera, ¿cómo puedo esperar a que se complete Parallel.ForEach y luego ejecutar las siguientes declaraciones?

VJAI
fuente

Respuestas:

192

No tiene que hacer nada especial, Parallel.Foreach()esperará hasta que se completen todas sus tareas ramificadas. Desde el hilo de llamada puede tratarlo como una sola declaración síncrona y, por ejemplo, envolverlo dentro de un try / catch.

Henk Holterman
fuente
10
"Parallel.Foreach () esperará hasta que se completen todas sus tareas ramificadas" se puede confundir en alguna situación, como (tarea asíncrona dentro): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /});
Bo HU
Aquí hay otros problemas en stackoverflow: stackoverflow.com/questions/11564506/…
Bo HU
44
Esta respuesta es de 2011, antes de async / wait. Pero, como dije, generar hilos dentro de ForEach no es una buena idea. Tampoco es una acción asíncrona. Los enlaces que publicaste proporcionan buena información y soluciones.
Henk Holterman
1
"generar hilos dentro de ForEach no es una buena idea" ¿puedes expandir? ¿Es eso "a menos que te asegures de esperar antes de regresar"?
Gianthra
16

No necesita eso con Parallel.Foreach: solo ejecuta foreach en tantos subprocesos como procesadores disponibles, pero vuelve sincrónicamente.

Más información se puede encontrar aquí

Louis Kottmann
fuente