2012-05-09 21 views
0

我使用TPL數據流與該初始網絡創建的源一起使用:該塊必須僅與從它被

(a)CustomSource => (b)TransformBlock 

當消息在B到達時,B創建新的變換塊以一個過濾器並將其附加到自身(對每個消息它都不是這樣)。

網絡變成這樣:

(a)CustomSource => (b)TransformBlock => (c with linkto filter)TransformBlock 

幾運行後網絡變得像:

(a)CustomSource => (b)TransformBlock 
    => (c with linkto filter)TransformBlock 
    => (c with another linkto filter)TransformBlock 
    => (c with another linkto filter)TransformBlock 

這工作不錯,而且我發現它們獲得一個默認動作的唯一解決方案爲「開關」塊。

但是當源是通過調用customSource.Complete()完成後,它會引發異常:

ArgumentException的:該塊必須僅與從中將其在創建的System.Threading 源使用.Tasks.Dataflow.DataflowBlock.FilteredLinkPropagator 1.System.Threading.Tasks.Dataflow.ITargetBlock<T>.OfferMessage(DataflowMessageHeader messageHeader, T messageValue, ISourceBlock 1種源,布爾consumeToAccept) 在System.Threading.Tasks.Dataflow.Internal.SourceCore 1.OfferMessageToTarget(DataflowMessageHeader header, TOutput message, ITargetBlock 1個靶,布爾& messageWasAccepted) 在System.Threading.Tasks.Dataflow.Internal.SourceCore 1.OfferToTargets(ITargetBlock 1 linkToTarget) at System.Threading.Tasks.Dataflow.Internal.SourceCore`1.OfferMessagesLoopCore()

+0

你能發表一個簡短的代碼來重現問題嗎?我的猜測是你試圖從'CustomSource'直接向'LinkTo'過濾器提供消息,但我不知道你會怎麼做。 – svick

+0

我想我找到了問題。其中一個「c」TransformBlock出現故障。當一個塊發生故障時,它不會自動從網絡中解除鏈接。添加完成任務以取消鏈接塊似乎解決了這個問題。 – Softlion

+0

btw,「c」TransformBlock故障,因爲它通過過濾器鏈接到一個子塊,但過濾器始終返回false。看起來TPL Dataflow不會丟棄該消息,但會出現該塊的錯誤。我正在使用.NET 4.5 beta中包含的版本。 – Softlion

回答

1

其中一個「c」TransformBlock出現故障。當一個塊發生故障時,它不會自動從網絡中解除鏈接。添加完成任務以取消鏈接塊似乎解決了這個問題。

相關問題