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

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

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

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

【问题讨论】:

    标签: c# concurrency task-parallel-library dataflow tpl-dataflow


    【解决方案1】:
    1. TransformManyBlock用于将输入上的一项转化为输出上的多项,与消费者数量无关。

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

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

    2. LinkTo()的返回值为:

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

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

    【讨论】:

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