C#排队要由线程池处理的依赖任务

Mic*_*eyn 8 .net c# .net-4.0 c#-4.0

我想将依赖任务排队到需要按顺序处理的几个流中(在每个流程中).流可以并行处理.

具体来说,假设我需要两个队列,并且我希望按顺序处理每个队列中的任务.下面是示例伪代码,用于说明所需的行为:

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
Run Code Online (Sandbox Code Playgroud)

这是一个图表,带有箭头,说明工作项之间的依赖关系:

在此输入图像描述

问题是如何使用C#4.0/.NET 4.0执行此操作?现在我有两个工作线程,每个队列一个,我BlockingCollection<>为每个队列使用一个.我想改为利用.NET线程池并让工作线程同时处理项目(跨流程),但是在流程中连续处理.换句话说,我希望能够表明,例如wi1b取决于wi1a的完成,而不必跟踪完成并记住wi1a,当wi1b到达时.换句话说,我只想说,"我想为queue1提交一个工作项,它将与我已经为queue1提交的其他项目串行处理,但可能与提交给其他队列的工作项目并行".

我希望这种描述有意义.如果没有,请随时在评论中提问,我会相应地更新这个问题.

谢谢阅读.

更新:

总结到目前为止"有缺陷"的解决方案,以下是我不能使用的答案部分的解决方案以及我不能使用它们的原因:

TPL任务需要为a指定先行任务ContinueWith().我不想在提交新任务时保持每个队列的先行任务的知识.

TDF ActionBlocks看起来很有希望,但似乎发布到ActionBlock的项目是并行处理的.我需要连续处理特定队列的项目.

更新2:

RE:ActionBlocks

看起来将MaxDegreeOfParallelism选项设置为1会阻止并行处理提交给单个工作项的工作项ActionBlock.因此,似乎ActionBlock每个队列解决了我的问题,唯一的缺点是这需要从Microsoft安装和部署TDF库,我希望有一个纯.NET 4.0解决方案.到目前为止,这是候选人接受的答案,除非有人能够找到一种方法来使用纯.NET 4.0解决方案来做到这一点,该解决方案不会退化为每个队列的工作线程(我已经在使用).

usr*_*usr 4

我知道您有很多队列并且不想占用线程。每个队列可以有一个ActionBlock。ActionBlock 可自动完成您所需的大部分工作:它连续处理工作项,并且仅在工作挂起时才启动任务。当没有待处理的工作时,不会阻塞任何任务/线程。