TPL Dataflow,如何将项目转发到许多链接目标块中的一个特定目标块?

我正在寻找一个TPL数据流块解决方案,它可以容纳多个项目,它可以链接到多个目标块,但是它能够将项目转发到仅通过filter/谓词的特定目标块。 任何时候都不应该将项目同时传递给多个目标块,始终只能与匹配filter的项目一起传递,否则该项目可以被丢弃。 我不喜欢BroadCastBlock,因为如果我理解正确,它不能保证传送(或者是吗?)并且过滤是在目标块侧完成的,这意味着BroadCastBlock基本上将每个项目的副本发送到所有linkedTo目标块。 如果我理解正确的话,它也不会在任何时候持有多个项目。 我不想使用Post / Async但维护LinkTo链。

是否有办法绕过完整的自定义数据流块? 或者我误解了BroadCastBlock的工作原理? 不幸的是,实际上没有太多文档可以详细介绍并涵盖用例。 任何想法都受到高度赞赏。

如果我理解正确,您可以通过一个简单的BufferBlock来完成,它将链接到带有谓词的所有目标块。 您还可以(无条件地)将其链接到NullTarget块 ,以丢弃不匹配的项目。

就像是:

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

这样,每个项目都将被发送到匹配的第一个目标(如果有的话)。

如果要将每个项目发送到多个目标,或者如果要在目标块不够快的情况下丢弃项目,则BroadcastBlock非常有用。

使用BroadcastBlock ,如果没有块接受它们,则可以删除项目(即使它们稍后可以接受它)。 但它不会随机丢弃项目,所以如果您的目标块没有设置BoundedCapacity ,我认为您可以确定它们将获得所有不会拒绝的项目(例如,通过在LinkTo()使用谓词) 。

我发现接受的答案是不正确的。 NullTarget应与其谓词相关联,否定消费者的否定。 否则,您可能会删除要使用的消息。

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