gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:58:32 24 4
gpt4 key购买 nike

我喜欢 TPL 数据流。

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

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

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

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

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

最佳答案

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

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);
}

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

但如果您真的想做您所要求的事情,您可以通过将 TransformBlock 封装在一个实现了 IPropgatorBlock 的自定义类中来做到这一点,并且还有您的抽象 Process() 方法。但是正确地做到这一点有点复杂,看看 Guide to Implementing Custom TPL Dataflow Blocks了解详情。

关于c# - 使用 TPL 数据流在预定义 block 之上创建可重用的处理逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com