【发布时间】:2014-01-01 11:39:38
【问题描述】:
我在这个初始网络中使用 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, ISourceBlock1 源,布尔值消费者接受) 在 System.Threading.Tasks.Dataflow.Internal.SourceCore1.OfferMessageToTarget(DataflowMessageHeader header, TOutput message, ITargetBlock1 目标,布尔值& messageWasAccepted) 在 System.Threading.Tasks.Dataflow.Internal.SourceCore1.OfferToTargets(ITargetBlock1 linkToTarget) 在 System.Threading.Tasks.Dataflow.Internal.SourceCore`1.OfferMessagesLoopCore()
【问题讨论】:
-
你能发布一个重现问题的短代码吗?我的猜测是你试图将来自
CustomSource的消息直接提供给LinkTo过滤器,但我不知道你会怎么做。 -
我想我找到了问题所在。 “c”TransformBlock 之一出现故障。当一个块出现故障时,它不会自动从网络断开链接。添加完成任务以取消链接块似乎可以解决此问题。
-
顺便说一句,“c”TransformBlock 出错,因为它通过过滤器链接到一个子块,但过滤器始终返回 false。似乎 TPL 数据流不会丢弃消息,但会导致块出错。我正在使用 .NET 4.5 beta 中包含的版本。
标签: .net task-parallel-library tpl-dataflow