你需要在TPL Dataflow的DataflowBlock.NullTarget<T>上等待完成吗?

3

像这样的问题:

TPL Dataflow,如何将项目转发到多个链接目标块中的仅一个特定目标块?

建议使用DataflowBlock.NullTarget{T}从管道中丢弃项目,例如:

forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>());

然而,如果您像这样使用NullTarget,那么如何等待完成呢?创建一个丢弃块是否更好:
ITargetBlock<SomeType> discard = DataflowBlock.NullTarget<SomeType>();
forwarder.LinkTo(discard);

那要在这里等待完成吗?

(即,)
discard.Completion.Wait()

您是否不需要等待“NullTarget”块完成,即只需将其丢弃并忘记?


你为什么想要等待它呢?那个块不进行任何处理,所以我不明白你为什么想要等待它。 - svick
因为我已经建立了一个管道,为了等待管道完成,我需要在所有端点上调用Wait()方法。这些看起来像是端点(并且它们确实有一个Completion属性)。 - bornfromanegg
好的,我已经查看了数据流库,并且显然这个完成返回一个TaskCompletionSource<VoidResult>().Task。看来我现在要研究一下TaskCompletionSource了! :-) - bornfromanegg
1个回答

3

这并没有正式的文档说明,但是根据我的测试,NullTargetCompletion 即使在你使用 Complete() 或者 Fault() 之后,也永远不会结束。

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


在内部,DataFlow甚至称之为“NeverCompletingTask”...我想这就解决了。干杯。 - bornfromanegg
呃,我曾尝试在我的工作流中使用NullTarget作为特定ActionBlock的无操作替代品,但是等待该块失败了。现在我知道原因了。看来这是未来版本改进的一个方向。 - Gordon Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接