TPL Dataflow和响应式扩展(Rx)相比,有哪些使用案例?

16

我正在考虑用其中之一或两者的组合编写一些信号处理算法。

性能不是重点,更重要的是表达意图的清晰度。

我将实现以下“块”并组合它们:

  • 滤波器(FIR和IIR)
  • 相位检测器
  • 积分器
  • 混频器
  • 函数发生器
  • PLL(使用以上模块构建)

我明白Rx可以被认为是“Linq-to-streams”,TPL则是并发的抽象。 我还知道Rx在内部使用TPL来管理其异步部分,而TPL数据流则为TPL添加了可组合性。

因此,两者都是异步的,都是可组合的,都相当高级(尤其是Rx)。 无论是通常情况下还是在我上述的信号处理项目中,应该在哪里使用每个框架?


@Paul R 感谢您的编辑,我没有注意到! - stevenrcfox
@Overflow,你最终采用了什么方法?能告诉我们吗? - Asti
1
我将同时使用TPL Dataflow作为基本构建块,Rx作为块内实现。我希望这样可以实现我的可组合性和易读性的目标。 - stevenrcfox
1个回答

7
这取决于你处理的原语类型 - 如果你使用扩展类型来推送数据,Rx和TPL会更加丰富,但如果你处理单个样本(例如IObservable<byte>ISourceBlock<float>等),那么使用它可能会很繁琐。
最近我实现了函数生成器、FFT、功率谱量化器等等,一开始我使用Rx(这不是并发/并行的情况,TPL在这方面表现出色),但我发现我花了更多的时间在尝试让它在Rx模型中工作 - 最终我选择了System.Stream
对我来说,它工作得很好,而且非常可组合。然而,性能和避免GC是我列表中的首要任务,所以如果你不介意这些问题,我建议使用Rx - 你可以用反应组合器做一些很酷的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接