TPL 数据流在运行时中断 LinkTo()

Posted

技术标签:

【中文标题】TPL 数据流在运行时中断 LinkTo()【英文标题】:TPL Dataflow break LinkTo() during runtime 【发布时间】:2012-08-16 11:18:14 【问题描述】:

我有一个TransformManyBlock<Tin, Tout>,在运行时通过LinkTo(...) 添加消费者(ActionBlocks)。

    TransformManyBlock 是否是正确的数据流块来消费元素、转换它们,然后输出(与输入相同数量的元素输出)给多个消费者(每个链接到的消费者像广播一样消费相同的元素)?我故意不选择 BroadCastBlock,因为它似乎无法像 BufferBlock 一样转换元素。

    我想知道如何在运行时取消链接消费者(此处为 ActionBlock)?据我所知,LinkTo() 似乎没有提供这样的功能。

【问题讨论】:

【参考方案1】:

    TransformManyBlock用于将输入上的一项转化为输出上的多项,与消费者数量无关。

    如果您想为每个目标分别执行转换,那么这正是BroadcastBlock 中的cloningFunction 的用途。

    如果您想执行一次转换,然后向每个目标发送相同的对象,您可以通过将TransformBlockBroadcastBlock 链接在一起来组合它们。该项目将由TransformBlock 转换,然后由BroadcastBlock 发送到所有目标。

    LinkTo()的返回值为:

    一个IDisposable,在调用Dispose 时,将取消源与目标的链接。

    这正是您所需要的。只需存储从LinkTo() 返回的值,然后在必要时存储Dispose()

【讨论】:

BroadcastBlock 是唯一可以做到这一点的块吗?我发现添加它会增加开销,因为它除了克隆之外什么都不做(应用于我的示例)。我希望能够找到一些可能不会增加这种开销的东西。 2. 正是我想要的,谢谢。 BroadcastBlock 是唯一一个将每条消息发送到其所有目标的内置块吗?是的。 (WriteOnceBlock 也可以这样做,但非常有限。)如果 BroadcastBlock 的开销对您来说实在是太多了,那么您将不得不创建自己的块,结合 TransformBlockBroadcastBlock,或类似的东西那个。 是的,抱歉,我正在度假...谢谢 Svick 的回答。 感谢 IDisposable 取消链接提示。 根据您断开链接的原因,您可能需要考虑 DataflowLinkOptions.MaxMessages,它会在达到目标消息数时自动断开链接。

以上是关于TPL 数据流在运行时中断 LinkTo()的主要内容,如果未能解决你的问题,请参考以下文章

为啥matlabcontrol在代理创建时中断调用线程?

c#当sql视图不存在时中断

如何在用户输入时中断 ocaml 程序

TPL Dataflow LinkTo TransformBlock 非常慢

Vue切换页面时中断axios请求

flink:在等待数据被管道确认时中断