gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:37:51 25 4
gpt4 key购买 nike

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

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

最佳答案

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

类似于:

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

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

BroadcastBlock 如果您想将每个项目发送到多个目标,或者如果您想要在目标 block 不够快的情况下丢弃项目。

使用 BroadcastBlock,如果没有 block 接受它们,项目可能会被丢弃(即使它们稍后可能能够接受)。但它不会随机掉落元素,所以如果你的目标 block 没有 BoundedCapacity 设置,我想你可以确定他们会得到他们不会拒绝的所有元素(例如通过在 LinkTo() 中使用谓词。

关于c# - TPL Dataflow,如何将项目转发到许多链接目标 block 中的一个特定目标 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13599190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com