2011-10-25 27 views
78

Estoy usando TPL en mi proyecto actual y usando Parallel.Foreach para hacer girar varios hilos. La clase Tarea contiene Esperar() para esperar hasta que la tarea se complete. De esa manera, ¿cómo puedo esperar para que se complete Parallel.ForEach y luego entrar en la siguiente declaración?¿Cómo puedo esperar hasta que el Parallel.ForEach complete

Respuesta

132

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

+2

"Parallel.Foreach() esperará hasta que todas sus tareas son ramificados completa" se puede confundir en alguna situación, como (tarea asíncrona dentro): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /}); –

+0

aquí hay otros problemas en stackoverflow: http://stackoverflow.com/questions/11564506/nesting-await-in-parallell-foreach –

+1

Esta respuesta es de 2011, antes de async/await. Pero como dije, los hilos de generación dentro del ForEach no son una buena idea. Tampoco es una acción asíncrona. Los enlaces que publicó brindan buena información y soluciones. –

11

No lo necesita con Parallel.Foreach: solo ejecuta el foreach en tantos subprocesos como haya procesadores disponibles, pero se devuelve sincrónicamente.

Más información se puede encontrar here

+9

El número (máximo) de subprocesos que utiliza no es tan simple. –

Cuestiones relacionadas