2014-02-20 52 views
3

问题像这样的:你需要等待完成对TPL数据流DataflowBlock.NullTarget <T>

TPL Dataflow, how to forward items to only one specific target block among many linked target blocks?

建议使用DataflowBlock.NullTarget横置丢弃从一个管道,例如项目

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

但是,如果您使用这样的NullTarget,您如何等待Completion?创建一个丢弃块会不会更好:

ITargetBlock<SomeType> discard = DataflowBlock.NullTarget<SomeType>(); 
forwarder.LinkTo(discard); 

并等待这个完成?即

discard.Completion.Wait() 

或者你并不需要等待“NullTarget”块完成后,即是它只是扔掉忘记?

+0

你为什么要*等待它?该块没有做任何处理,所以我没有看到任何理由,你想等待它。 – svick

+0

因为我已经构建了一个管道,并且为了等待管道完成,我需要在所有端点上等待()。这些看起来像我的终点(他们确实有一个完成属性)。 – bornfromanegg

+0

好吧,我已经看了一下数据流库,显然这个完成返回TaskCompletionSource ().Task。猜猜我现在正在阅读TaskCompletionSource! :-) – bornfromanegg

回答

3

这是没有记录,但在我的测试基础,一个NullTargetCompletion从未完成后,即使您Complete()Fault()它。

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

+0

在内部,DataFlow甚至称这个为“NeverCompletingTask”......所以我想这个解决了它。干杯。 – bornfromanegg

+0

Ug。我曾尝试将NullTarget用作工作流中特定ActionBlock的无操作替代品,但后来在该块中等待失败。现在我知道为什么。似乎这是未来版本的一个改进领域。 –