Tarefas dependentes do enfileiramento de C # a serem processadas por um conjunto de encadeamentos

Eu quero enfileirar tarefas dependentes em vários fluxos que precisam ser processados ​​em ordem (em cada fluxo). Os fluxos podem ser processados ​​em paralelo.

Para ser específico, digamos que eu precise de duas filas e quero que as tarefas em cada fila sejam processadas em ordem. Aqui está um exemplo de pseudocódigo para ilustrar o comportamento desejado:

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

Aqui está um diagrama com setas ilustrando dependências entre itens de trabalho:

A questão é como faço isso usando c # 4.0 / .net 4.0? Agora eu tenho dois threads de trabalho, um por fila e eu uso umBlockingCollection<> para cada fila. Em vez disso, gostaria de aproveitar o pool de threads do .NET e fazer com que os threads de trabalho processem itens simultaneamente (entre fluxos), mas em série dentro de um fluxo. Em outras palavras, eu gostaria de poder indicar que, por exemplo, o wi1b depende da conclusão do wi1a, sem ter que rastrear a conclusão e lembrar do wi1a, quando o wi1b chegar. Em outras palavras, quero apenas dizer: "Quero enviar um item de trabalho para a fila 1, que deve ser processado em série com outros itens que já enviei para a fila 1, mas possivelmente em paralelo com itens de trabalho enviados para outras filas".

Espero que esta descrição faça sentido. Se não, por favor sinta-se livre para fazer perguntas nos comentários e eu atualizarei esta questão de acordo.

Obrigado pela leitura.

Atualizar:

Para resumir as soluções "falhas" até agora, aqui estão as soluções da seção de respostas que não posso usar e as razões pelas quais não posso usá-las:

As tarefas TPL requerem a especificação da tarefa antecedente para umContinueWith(). Eu não quero manter o conhecimento da tarefa antecedente de cada fila ao enviar uma nova tarefa.

Os ActionBlocks do TDF pareciam promissores, mas parece que os itens postados em um ActionBlock são processados ​​em paralelo. Preciso que os itens de uma determinada fila sejam processados ​​em série.

Atualização 2:

RE: ActionBlocks

Parece que definir oMaxDegreeOfParallelism opção para um impede o processamento paralelo de itens de trabalho submetidos a um únicoActionBlock. Portanto, parece que ter umActionBlock por fila resolve o meu problema com a única desvantagem de que isso requer a instalação e implantação da biblioteca TDF da Microsoft e eu estava esperando por uma solução .NET 4.0 pura. Até agora, essa é a resposta aceita pelo candidato, a menos que alguém consiga descobrir uma maneira de fazer isso com uma solução .NET 4.0 pura que não se degenere para um thread de trabalho por fila (que já estou usando).

questionAnswers(4)

yourAnswerToTheQuestion