我使用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.SourceCore1.OfferMessageToTarget(DataflowMessageHeader header, TOutput message, ITargetBlock
1個靶,布爾& messageWasAccepted) 在System.Threading.Tasks.Dataflow.Internal.SourceCore1.OfferToTargets(ITargetBlock
1 linkToTarget) at System.Threading.Tasks.Dataflow.Internal.SourceCore`1.OfferMessagesLoopCore()
你能發表一個簡短的代碼來重現問題嗎?我的猜測是你試圖從'CustomSource'直接向'LinkTo'過濾器提供消息,但我不知道你會怎麼做。 – svick
我想我找到了問題。其中一個「c」TransformBlock出現故障。當一個塊發生故障時,它不會自動從網絡中解除鏈接。添加完成任務以取消鏈接塊似乎解決了這個問題。 – Softlion
btw,「c」TransformBlock故障,因爲它通過過濾器鏈接到一個子塊,但過濾器始終返回false。看起來TPL Dataflow不會丟棄該消息,但會出現該塊的錯誤。我正在使用.NET 4.5 beta中包含的版本。 – Softlion