2014-02-20 47 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的無操作替代品,但後來在該塊中等待失敗。現在我知道爲什麼。似乎這是未來版本的一個改進領域。 –