【问题标题】: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.NullTarget{T} 从管道中丢弃项目,例如

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! :-)

标签: task-parallel-library dataflow


【解决方案1】:

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

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

【讨论】:

  • 在内部,DataFlow 甚至称其为“NeverCompletingTask”......所以我想这解决了它。干杯。
  • 丑。我曾尝试使用 NullTarget 作为工作流程中特定 ActionBlock 的无操作替代品,但随后等待该块失败。现在我知道为什么了。似乎这是未来版本的改进领域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多