TPL数据流 - 条件循环

时间:2016-12-16 09:27:19

标签: c# .net task-parallel-library pipeline tpl-dataflow

目前我正在研究管道数据流,其中除第1阶段之外的每个阶段都是async正在运行的消费者和生产者。我有物品"流动"通过我的管道,参考项目。在第3阶段,我想创建一个循环并缓冲满足特殊条件的所有对象(Stage Loop)。

如果新对象进入(阶段3)而当前有其他对象被缓冲(阶段循环),我想检查它们在引用项中是否匹配,如果是,则将它们发布到阶段的BufferBlock循环。

问题是,如何在Stage 3中检查Stage Loop中所有对象的引用项?

管道有点像这样:

Incoming objects ->  
  BufferBlock1 -> Parsing (Stage2) ->  
  BufferBlock2 -> Processing (Stage3) ->
  BufferBlock3 -> Stage Loop ->  
    Back to BufferBlock 2

1 个答案:

答案 0 :(得分:0)

你真的不需要你链中的那么多BufferBlockTPL Dataflow包含TransformBlock,它封装了BufferBloсkActionBlock逻辑,并为处理过的消息提供了输出块。

至于循环,你可以在彼此之间链接块with static extension method,所以这可能看起来像

stage2.LinkTo(stage3, CheckForExistingProcessing);
stage2.LinkTo(stage4);

Jere stage4是一个没有通过检查的消息队列,必须在循环中处理。您可以设置其他ActionBlock,或者,也许只需使用TransformBlock再次将消息发送到适当的阶段。我认为您也可以引入重试检查,因为某些消息可能根本无法处理。

此外,正如您所说的有async逻辑,您可能应该SendAsync消息而不是Post消息(您也可以使用{{3 }}):

// asynchronously wait for a sending with resending attempts
await stage1.SendAsync(m);
// asynchronously wait for a sending with resending attempts with possible cancellation
await stage2.SendAsync(m, token);

CancellationToken方法是同步的,删除邮件,如果它们不被目标接受,则比较尝试传递邮件的Post方法即使目标无法接受它现在。