在使用 TPL 数据流的预定义块之上创建可重用的处理逻辑?

Dod*_*odd 3 c# task-parallel-library .net-4.5 tpl-dataflow

我喜欢 TPL 数据流。

嗯,一个有趣的设计选择是,大多数预定义块使用委托来允许我们实现处理逻辑。这在简单的场景中看起来不错。但是让我们考虑一下现实世界的大型应用程序,它需要模块化和封装性。我发现使用 DELEGATE 方法编写结构良好的应用程序既困难又不自然。

例如,如果我想要的只是 aMultiplyIntByTwoTransformBlock和 aNoOpActionBlock作为可重用的类 TYPE (而不是实例)。我如何实现它?我希望我可以从TransformBlock/继承ActionBlock并说,覆盖一些Process()方法来实现这一点。但是预定义的块是密封的。他们只接受代表。

我知道我可以从头开始创建一个自定义块,但显然这对我来说太复杂了,因为我需要的只是在预定义块之上进行一些自定义。

那么,我如何实现我的目标?

更新:我并不是说有些事情代表不能做。我是说在模板方法模式中公开抽象块在许多情况下更好。比如说,我希望我可以编写一个 AbstractMultiplyBlock 和 MultiplyByTwoBlock 和 MultiplyByThreeBlock,利用多态性。遗憾的是,代表们没有提供这种数据和逻辑可重用性。

svi*_*ick 5

我看不出您需要自定义块类型的任何理由。辅助方法应该足够了:

public static IPropagatorBlock<int, int> CreateMultiplyIntTransformBlock(
    int multiplier)
{
    return new TransformBlock<int, int>(i => i * multiplier);
}

public static IPropagatorBlock<int, int> CreateMultiplyIntByTwoTransformBlock()
{
    return CreateMultiplyIntTransformBlock(2);
}
Run Code Online (Sandbox Code Playgroud)

如果您认为委托对您来说还不够,那么您可能正试图将您的逻辑放在错误的位置。委托没有理由不能使用正确使用封装和模块化的对象。这样,您的应用程序逻辑与执行代码的逻辑保持分离。

但是,如果您真的想做您所要求的事情,则可以通过将 a 封装TransformBlock在实现IPropgatorBlock并具有您的抽象Process()方法的自定义类中来实现。但是正确执行此操作有些复杂,有关详细信息,请查看实现自定义 TPL 数据流块的指南