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
的用途。
如果您想执行一次转换,然后向每个目标发送相同的对象,您可以通过将TransformBlock
和BroadcastBlock
链接在一起来组合它们。该项目将由TransformBlock
转换,然后由BroadcastBlock
发送到所有目标。
LinkTo()
的返回值为:
一个
IDisposable
,在调用Dispose
时,将取消源与目标的链接。
这正是您所需要的。只需存储从LinkTo()
返回的值,然后在必要时存储Dispose()
。
【讨论】:
BroadcastBlock 是唯一可以做到这一点的块吗?我发现添加它会增加开销,因为它除了克隆之外什么都不做(应用于我的示例)。我希望能够找到一些可能不会增加这种开销的东西。 2. 正是我想要的,谢谢。BroadcastBlock
是唯一一个将每条消息发送到其所有目标的内置块吗?是的。 (WriteOnceBlock
也可以这样做,但非常有限。)如果 BroadcastBlock
的开销对您来说实在是太多了,那么您将不得不创建自己的块,结合 TransformBlock
和 BroadcastBlock
,或类似的东西那个。
是的,抱歉,我正在度假...谢谢 Svick 的回答。
感谢 IDisposable 取消链接提示。
根据您断开链接的原因,您可能需要考虑 DataflowLinkOptions.MaxMessages,它会在达到目标消息数时自动断开链接。以上是关于TPL 数据流在运行时中断 LinkTo()的主要内容,如果未能解决你的问题,请参考以下文章