您是不是需要等待 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().Task。猜猜我现在正在阅读 TaskCompletionSource! :-) 【参考方案1】:

这没有记录,但根据我的测试,NullTargetCompletion永远完成,即使在您 Complete()Fault() 之后也是如此。

这意味着您不能等待NullTarget 块的完成,因为等待永远不会结束。

【讨论】:

在内部,DataFlow 甚至称其为“NeverCompletingTask”......所以我想这解决了它。干杯。 丑。我曾尝试使用 NullTarget 作为工作流程中特定 ActionBlock 的无操作替代品,但随后等待该块失败。现在我知道为什么了。似乎这是未来版本的改进领域。

以上是关于您是不是需要等待 TPL 数据流 DataflowBlock.NullTarget<T> 完成的主要内容,如果未能解决你的问题,请参考以下文章

TPL Dataflow 如何与“全局”数据同步

意外行为 - TPL DataFlow BatchBlock 在 TriggerBatch 执行时拒绝项目

TPL Dataflow ,完成一个 Block ,重新创建一个 BLock

TPL Dataflow LinkTo TransformBlock 非常慢

TPL Dataflow 模块可从单个输入生成多个输出

TPL Dataflow,数据块收到第一项时的通知