您是不是需要等待 TPL 数据流 DataflowBlock.NullTarget<T> 完成
Posted
技术标签:
【中文标题】您是不是需要等待 TPL 数据流 DataflowBlock.NullTarget<T> 完成【英文标题】:Do you need to wait for completion on a TPL Dataflow DataflowBlock.NullTarget<T>您是否需要等待 TPL 数据流 DataflowBlock.NullTarget<T> 完成 【发布时间】:2014-03-21 02:35:10 【问题描述】:这样的问题:
TPL Dataflow, how to forward items to only one specific target block among many linked target blocks?
建议使用 DataflowBlock.NullTargetT 从管道中丢弃项目,例如
forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>());
但是,如果您像这样使用 NullTarget,您如何等待 Completion?创建丢弃块不是更好吗:
ITargetBlock<SomeType> discard = DataflowBlock.NullTarget<SomeType>();
forwarder.LinkTo(discard);
然后等待完成?即
discard.Completion.Wait()
或者你不需要等待“NullTarget”块的完成,即它只是扔掉然后忘记吗?
【问题讨论】:
你为什么想要等待它?该块不做任何处理,所以我看不出你有什么理由要等待它。 因为我已经建立了一个管道,为了等待管道完成,我需要在所有端点上 Wait()。这些在我看来就像端点(并且它们确实具有 Completion 属性)。 好的,我查看了数据流库的内部,显然它的完成返回了一个 TaskCompletionSource这没有记录,但根据我的测试,NullTarget
的 Completion
将永远完成,即使在您 Complete()
或 Fault()
之后也是如此。
这意味着您不能等待NullTarget
块的完成,因为等待永远不会结束。
【讨论】:
在内部,DataFlow 甚至称其为“NeverCompletingTask”......所以我想这解决了它。干杯。 丑。我曾尝试使用 NullTarget 作为工作流程中特定 ActionBlock 的无操作替代品,但随后等待该块失败。现在我知道为什么了。似乎这是未来版本的改进领域。以上是关于您是不是需要等待 TPL 数据流 DataflowBlock.NullTarget<T> 完成的主要内容,如果未能解决你的问题,请参考以下文章
意外行为 - TPL DataFlow BatchBlock 在 TriggerBatch 执行时拒绝项目
TPL Dataflow ,完成一个 Block ,重新创建一个 BLock