目前我正在研究管道数据流,其中除第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
答案 0 :(得分:0)
你真的不需要你链中的那么多BufferBlock
。 TPL Dataflow包含TransformBlock
,它封装了BufferBloсk
和ActionBlock
逻辑,并为处理过的消息提供了输出块。
至于循环,你可以在彼此之间链接块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
方法即使目标无法接受它现在。