21

经过几天的谷歌搜索,我想我无法决定哪一个适用于什么场景。当然,我想使用一个结合了两者的完美框架(当然不切实际)。我什至知道可以一起使用它们。但真正的问题是,每一个中的核心设计元素是什么,使得它们无法相互模仿。这些是我找到的:

  • 在 RX 中存在虚拟时间,因此调度程序有效地控制整个网络,但在 TDF 中这是不可能的,因为每个块使用不同的任务并且它们独立运行
  • 在 TDF 中,一个块可以重试接收消息/重发之类的东西,但在 RX 中这是不可能的。
  • 在 rx 中,数据流是序列化的,但在 TDF 中这是可选的

最好有一些不是列表的理解,而是试图从一个共同的抽象类/类别中派生出的东西,只谈论结构差异。

4

1 回答 1

8

我认为解决这个问题的最好方法是只关注问题的第一行——决定在给定场景中使用哪一个。

这两个库服务于不同的目的。推测每个设计的核心元素以寻找差异感觉就像问为什么粉笔尝起来不像奶酪 - 尽管我不能挑剔你列出的具体点。

根据我的经验,很少有非平凡的场景可以以任何明智的方式互换。我认为他们文档中的实际描述对这个问题做出了不言自明的回答:

接收

Reactive Extensions (Rx) 是一个库,用于使用可观察序列和 LINQ 样式的查询运算符组成异步和基于事件的程序。使用 Rx,开发人员使用 LINQ 运算符表示异步数据流,并使用调度程序参数化异步数据流中的并发性。简单来说,Rx = Observables + LINQ + Schedulers

我还会在这里查看我的其他答案,这在考虑 Rx 时非常相关:Where to draw the line with reactive programming。其本质是 Rx 有利于及时响应您无法控制的事件。

TPL 数据流

任务并行库 (TPL) 提供数据流组件来帮助提高支持并发的应用程序的稳健性。这些数据流组件统称为 TPL 数据流库。该数据流模型通过为粗粒度数据流和流水线任务提供进程内消息传递来促进基于参与者的编程。数据流组件建立在 TPL 的类型和调度基础架构之上,并与 C#、Visual Basic 和 F# 语言集成以支持异步编程。当您有多个必须以异步方式相互通信的操作或当您希望在数据可用时对其进行处理时,这些数据流组件非常有用。例如,考虑一个处理来自网络摄像头的图像数据的应用程序。通过使用数据流模型,应用程序可以在图像帧可用时对其进行处理。如果应用程序增强了图像帧,例如,通过执行光线校正或红眼消除,您可以创建数据流组件的管道。管道的每个阶段都可能使用更粗粒度的并行功能(例如 TPL 提供的功能)来转换图像。

于 2016-03-22T14:08:18.860 回答