【问题标题】:This block must only be used with the source from which it was created此块只能与创建它的源一起使用
【发布时间】: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.FilteredLinkPropagator1.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


【解决方案1】:

其中一个“c”TransformBlock 出现故障。当一个块出现故障时,它不会自动从网络断开链接。添加完成任务以取消链接块似乎可以解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多