2009-05-27 10 views
8

Estoy jugando con la idea de implementar un gen Productor/Consumidor + cola de procesamiento en C# por diversión. La idea es que solo pueda crear objetos que implementen las interfaces IProducer e IConsumer apropiadas (se proporcionan las implementaciones predeterminadas), que consistirán principalmente de delegados, las pasarán a una instancia de clase QueueProcessor, le dirán cuántos consumidores desea y se irán.Genérico .Net Productor/Consumidor

Pero me digo a mí mismo: "Sí, seguramente esto ya se ha hecho antes".

Así que ¿alguien sabe de un buen , genérica implementación del patrón de productor/consumidor en C# (VB.Net está bien, también)? Los requisitos básicos que estoy buscando:

  • Use genéricos para los tipos producidos y consumidos (de entrada, en la cola de tareas y tipos de salida, o cualquier combinación de los mismos)
  • le permiten especificar cuántos consumidores va a funcionar el cola de
  • permitirá enlazar hacia arriba o cadena de múltiples colas en una tubería (complicados con múltiples consumidores, lo sé)
  • le permiten implementar sus propios productores y consumidores
  • permitirá convertir cualquier IEnumerable en un productor (está bien si tengo que implementarlo yo mismo, siempre y cuando sea es posible)
  • Delegado basada (se puede utilizar la sintaxis lambda para el consumidor o productor trabajo básico para procesar un solo elemento)

O si no la hay, qué errores ha impedido y tiene usted alguna idea de cómo implementarlo?

+0

¿Ha mirado http://msdn.microsoft.com/en-us/library/dd267312.aspx? – porges

+0

Sí, e IProducerConsumerCollection , pero aún no existía nada de eso cuando hice la pregunta por primera vez. Escribe una publicación sobre el soporte en 4.0 y recibirás un voto favorable rápido de mi parte. –

+0

Argh! No sé cómo sigue sucediendo esto ... Siempre termino con mensajes de hace 2 años: P – porges

Respuesta

5

Microsoft CCR contiene mucho de lo que necesita.

Here son algunos ejemplos de código y notas de uso.

+0

Yo _know_ esto tenía que estar en algún lugar ya. –

+0

No es un marco perfecto, sin algunas cosas obvias como la capacidad de DETENER el procesamiento y ESPERAR las tareas restantes. Estamos mejorando el marco en nuestro equipo de desarrollo, si necesita más ayuda, hágamelo saber ... – ripper234

0

¿Has mirado MiscUtil?

+0

No veo nada allí que haga lo que estoy pidiendo. –

+0

No quiere decir que no haya visto algunas cosas que serían muy útiles para implementar esto. –

+0

Así que pondrás cualquier mejora que hagas en tu implementación a tiempo, entonces ...: P –

2

Marc Gravell escribió un buen ejemplo de cola de bloqueo en this answer.