我寻找能容纳比单个项目,其可链接到多个目标块以上的TPL数据流块的解决方案,但它具有一个项目转发到仅通过过滤器/谓词特定目标块的能力。 在任何时候,应的项目的同时被输送到多个目标块,总是只对其中一个相匹配的过滤器或该项目可以被丢弃。 我不喜欢BroadCastBlock的,因为,如果我理解正确的话,它不保证交付(或做它?)和滤波目标块端完成,这意味着BroadCastBlock基本上将每个项目的副本,所有linkedTo目标块。 它还如果我理解正确的话没有在任何时候持有多个项目。 我不想使用POST /异步但保持LinkTo链。
是否有围绕一个完整的自定义数据流块的方法吗? 还是我误解BroadCastBlock是如何工作的? 不幸的还真是不多文档在那里,进入细节,包括用例。 任何想法受到了高度评价。
如果我理解正确的话,你想要什么可以通过一个简单的完成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()
。
我发现接受的答案是不正确的。 该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?