TPL数据流,怎么着许多目标挂钩块中的项目只有一个特定的目标块?(TPL Dataflow, how

2019-07-04 05:07发布

我寻找能容纳比单个项目,其可链接到多个目标块以上的TPL数据流块的解决方案,但它具有一个项目转发到仅通过过滤器/谓词特定目标块的能力。 在任何时候,应的项目的同时被输送到多个目标块,总是只对其中一个相匹配的过滤器或该项目可以被丢弃。 我不喜欢BroadCastBlock的,因为,如果我理解正确的话,它不保证交付(或做它?)和滤波目标块端完成,这意味着BroadCastBlock基本上将每个项目的副本,所有linkedTo目标块。 它还如果我理解正确的话没有在任何时候持有多个项目。 我不想使用POST /异步但保持LinkTo链。

是否有围绕一个完整的自定义数据流块的方法吗? 还是我误解BroadCastBlock是如何工作的? 不幸的还真是不多文档在那里,进入细节,包括用例。 任何想法受到了高度评​​价。

Answer 1:

如果我理解正确的话,你想要什么可以通过一个简单的完成BufferBlock ,这将被链接到与谓词所有目标块。 你还能(无条件),其链接到NullTarget块 ,丢弃不匹配的项目。

就像是:

var forwarder = new BufferBlock<SomeType>();
forwarder.LinkTo(target1, item => matchesTarget1(item));
forwarder.LinkTo(target2, item => matchesTarget2(item));
forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>());

这样一来,每个项目将被发送到匹配,如果有任何的第一个目标。

BroadcastBlock如果你想给每个项目发送到多个目标可能是有用的,或者如果你想放弃的项目,如果目标块的速度不够快。

随着BroadcastBlock ,项目可如果没有块接受他们(即使他们可以日后接受)下降。 不过,这并不随机掉落物品,所以如果你的对象块没有BoundedCapacity集,我觉得你可以肯定,他们会得到他们不衰的所有项目(通过例如使用谓词LinkTo()



Answer 2:

我发现接受的答案是不正确的。 该NullTarget应与谓词是你的消费者的否定链接。 否则,你可能会下降,你想使用消息。

var forwarder = new BufferBlock<SomeType>();
forwarder.LinkTo(target1, item => matchesTarget1(item));
forwarder.LinkTo(target2, item => matchesTarget2(item));
forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>(), item => !matchesTarget1(item) && !matchesTarget2(item));


文章来源: TPL Dataflow, how to forward items to only one specific target block among many linked target blocks?