2011-07-01 16 views
5

¿Es posible tener un paralelo para cada proceso de bucle los artículos en una cola de tal manera que:ForEach paralelo, y las colas

  1. sólo elimina los objetos que se están procesando
  2. se detiene hasta que se añaden nuevos elementos a la cola

EDIT: Esto es en lo que respecta a la funcionalidad Parallel.ForEach System.Threading.Tasks'

+0

Salida a esta pregunta también: http://stackoverflow.com/questions/6308225/tpl-architectural-question –

+0

nah de la respuesta para esa la pregunta es demasiado compleja. La Programación Reactiva es la solución. –

Respuesta

8

Suscríbase a la cola usando Reactive Extensions y ejecute cada elemento en una nueva tarea. No tendrá que bloquear ni esperar un nuevo artículo, ya que se insertará en su lambda de suscripción y su ejecución/procesamiento será paralelo.

http://rxwiki.wikidot.com/101samples

+0

Extensiones reactivas Parece bueno, gracias. –

+0

Ok, es el modelo de Programación Reactiva y RX es una implementación de eso. Gracias Hasan –

0

Creo que sería posible si la cola de hormigón EJECUCIÓ La sincronización está sincronizada, básicamente este es un escenario de consumidor-productor.

+0

¿Uh? Lo siento, no lo entendí en absoluto :( –

+0

Si entiendo tu pregunta correctamente, quieres repetir la misma cola en 2 diferentes para cada uno de los bucles, entonces básicamente tendrías dos hilos cada uno haciendo su para cada ciclo, para que esto funcione, la cola debería admitir la sincronización entre los hilos. –

+0

Oh, lo siento, me refería a la funcionalidad System.Threading.Tasks 'Parallel.ForEach. –

0

Parece que está hablando de una situación clásica de productor/consumidor. Siempre me sorprende que no haya más soporte directo para este modelo integrado en .Net. Lo más cercano que he encontrado en .Net estuvo oculto en el tiempo de ejecución y simultaneidad de coordinación, que formaba parte de la suite de Microsoft Robotics. Buena suerte encontrándolo ahora.

Pero una vez que sepa qué buscar, un rápido control de Google proporciona algunas otras posibles opciones.

1

Uso BlockingCollection algo como esto:

var bc = new BlockingCollection<int>(); 
Task.Factory.StartNew(() => 
    { 
     ParallelOptions options = new ParallelOptions 
      { 
       MaxDegreeOfParallelism = 30 
      }; 
     Parallel.ForEach(bc.GetConsumingEnumerable(), options, i => { }); 
    }); 
+1

Por lo tanto, la tarea esperará hasta que se coloquen nuevos elementos en la colección antes de continuar correctamente? –

Cuestiones relacionadas