【问题标题】:ActionBlock or TransformBlock when just modifying TInput and not creating a different TOutput?仅修改 TInput 而不创建不同的 TOutput 时的 ActionBlock 或 TransformBlock?
【发布时间】:2014-05-07 02:46:32
【问题描述】:

当菊花链多个修改相同TInput元素的块时,我可以使用ActionBlock<TInput>TransformBlock<TInput,TInput>,不同之处在于Transform的委托将返回相同的(但修改过的元素)而Action委托不会'不返回任何东西,它只会修改输入元素。

两者都有效,我认为两者在语义上都有意义,但我假设其中只有一种是预期的方式。

如果我不得不猜测,我会说它是 Action,因为当返回相同的元素时,它并不是真正的转换。但是,如果我不得不出于更务实的原因进行猜测,我会说 Transform,因为如果我将这些块以菊花链形式连接起来,Transform 似乎允许我将“已处理”元素直接发布到下一个块,但不确定如何执行与行动。

【问题讨论】:

  • 一个想法:你就地修改元素而不是转换它吗?由于所有正常的不变性好处原因,我希望转换方法更容易诊断。
  • 我想我可以通过创建实现或封装原始类的不同“修改”类来稍微“丰富”我的架构。例如,假设我正在修改的元素是Bimbo 类型,并且操作包括分配一个类别。我可以改为创建一个新类“ClassifiedBimbo”,我的 lambda 就像public ClassifiedBimbo ClassifyBimbo(Bimbo bimbo)。这有意义吗?
  • 是的,这对我来说是个好主意。如果您可以接受不变性,那么根据我的经验,数据管道最终会更易于使用 - 也更清晰。

标签: .net task-parallel-library tpl-dataflow


【解决方案1】:

如果您想修改块中的对象,然后在另一个块中使用它,那么唯一正确的选择是使用TransformBlock。我会说这是一个转换:生成的对象与原始对象具有相同的身份,但它在块中被修改(或“转换”)。

ActionBlock 最常被用作管道的末端,它的最后一步。这不是你想要的,所以ActionBlock 不合适。

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多