Las tareas dependientes de la cola de C # serán procesadas por un grupo de subprocesos

Quiero poner en cola las tareas dependientes de varios flujos que deben procesarse en orden (en cada flujo). Los flujos se pueden procesar en paralelo.

Para ser específicos, digamos que necesito dos colas y quiero que las tareas en cada cola se procesen en orden. Aquí hay un ejemplo de pseudocódigo para ilustrar el comportamiento deseado:

Queue1_WorkItem wi1a=...;

enqueue wi1a;

... time passes ...

Queue1_WorkItem wi1b=...;

enqueue wi1b; // This must be processed after processing of item wi1a is complete

... time passes ...

Queue2_WorkItem wi2a=...;

enqueue wi2a; // This can be processed concurrently with the wi1a/wi1b

... time passes ...

Queue1_WorkItem wi1c=...;

enqueue wi1c; // This must be processed after processing of item wi1b is complete

Aquí hay un diagrama con flechas que ilustran las dependencias entre los elementos de trabajo:

La pregunta es ¿cómo hago esto usando C # 4.0 / .NET 4.0? En este momento tengo dos subprocesos de trabajo, uno por cola y uso unBlockingCollection<> para cada cola. En cambio, me gustaría aprovechar el grupo de subprocesos .NET y hacer que los subprocesos de trabajo procesen los elementos simultáneamente (a través de flujos), pero en serie dentro de un flujo. En otras palabras, me gustaría poder indicar que, por ejemplo, wi1b depende de la finalización de wi1a, sin tener que rastrear la finalización y recordar wi1a, cuando llega wi1b. En otras palabras, solo quiero decir: "Quiero enviar un elemento de trabajo para la cola1, que se procesará en serie con otros elementos que ya he enviado para la cola1, pero posiblemente en paralelo con los elementos de trabajo enviados a otras colas".

Espero que esta descripción tenga sentido. Si no es así, no dude en hacer preguntas en los comentarios y actualizaré esta pregunta en consecuencia.

Gracias por leer.

Actualizar:

Para resumir las soluciones "defectuosas" hasta ahora, aquí están las soluciones de la sección de respuestas que no puedo usar y las razones por las que no puedo usarlas:

Las tareas TPL requieren especificar la tarea antecedente para unaContinueWith(). No quiero mantener el conocimiento de la tarea de antecedentes de cada cola al enviar una nueva tarea.

Los ActionBlocks de TDF parecían prometedores, pero parece que los elementos publicados en un ActionBlock se procesan en paralelo. Necesito que los elementos de una cola en particular se procesen en serie.

Actualización 2:

RE: ActionBlocks

Parecería que el ajuste de laMaxDegreeOfParallelism La opción a uno evita el procesamiento paralelo de elementos de trabajo enviados a un soloActionBlock. Por lo tanto, parece que tener unaActionBlock Por cola, soluciono mi problema, con la única desventaja de que esto requiere la instalación y el despliegue de la biblioteca TDF de Microsoft y esperaba una solución .NET 4.0 pura. Hasta ahora, esta es la respuesta aceptada por el candidato, a menos que alguien pueda encontrar una manera de hacerlo con una solución .NET 4.0 pura que no degenerará en un hilo de trabajador por cola (que ya estoy usando).

Respuestas a la pregunta(4)

Su respuesta a la pregunta