反应性扩展框架

反应式扩展 (Rx) 是一个库,用于使用可观测序列和 LINQ 样式的查询运算符编写异步和基于事件的程序。

数据序列可以采用多种形式,例如来自文件或 Web 服务的数据流、Web 服务请求、系统通知或一系列事件(如用户输入)。

反应扩展将所有这些数据序列表示为可观察序列。 应用程序可以订阅这些可观测序列,以在新数据到达时接收异步通知。 Rx 库可用于 .NET 中的桌面应用程序开发。 它还针对 Silverlight、Windows Phone 7 和 JavaScript 发布。 有关这些不同平台的详细信息,请参阅 Rx 版本之间的差异 主题。

拉取数据与推送数据

在交互式编程中,应用程序通过从表示源的序列中提取数据,主动轮询数据源以获取更多信息。 此类行为由 IEnumerable<T>/IEnumerator T> 的迭代器<模式表示。 IEnumerable<T> 接口公开单个方法 GetEnumerator () ,该方法返回 IEnumerator<T> 以循环访问此集合。  IEnumerator<T> 允许通过返回 Current 属性) 获取当前项 (,并通过调用 MoveNext 方法) 来确定是否有更多项要循环访问 (。 

应用程序在数据检索过程中处于活动状态:除了通过调用 GetEnumerator 获取枚举器外,它还通过在方便时调用 MoveNext 来控制检索速度。 此枚举模式是同步的,这意味着在轮询数据源时可能会阻止应用程序。 这种拉取模式类似于参观图书馆和查看一本书。 完成这本书后,你再去一次检查另一个。

另一方面,在反应式编程中,通过订阅 Rx) 中称为可观测序列的数据流 (为应用程序提供更多信息,并且任何更新都从源传递给它。 应用程序在数据检索过程中是被动的:除了订阅可观测源外,它不会主动轮询源,而只是对推送到源的数据做出反应。 当流没有更多数据要提供时,或者当它出错时,源将向订阅者发送通知。 这样,应用程序就不会因等待源更新而受阻。

这是反应式扩展采用的推送模式。 这类似于加入一个图书俱乐部,在该俱乐部中注册你对特定流派的兴趣,并且符合你兴趣的书籍在出版时会自动发送给你。 你不需要排队来获取你想要的东西。 在许多情况下,使用推送模式非常有用,尤其是在 UI 密集型环境中,在应用程序等待某些事件时无法阻止 UI 线程。 这在编程环境(如 Silverlight)中也至关重要,后者具有自己的一组异步要求。 总之,通过使用 Rx,可以使应用程序更具响应性。

Rx 实现的推送模型由 IObservable<T>/IObserver<T> 的可观测模式表示。 IObservable<T> 接口是熟悉的 IEnumerable<T> 接口的双重接口。 它提取一个数据序列,并保留对数据序列感兴趣的 IObserver<T> 实现列表。 IObservable 将自动通知所有观察者任何状态更改。 若要通过订阅注册兴趣,请使用 IObservable 的 Subscribe 方法,该方法接受 IObserver 并返回 IDisposable。 这使你能够跟踪和处置订阅。 此外,Rx 基于可观测序列的 LINQ 实现允许开发人员基于推送的序列(例如 .NET 事件、基于 APM 的 (“IAsyncResult”) 计算、基于任务<T> 的计算、Windows 7 传感器和位置 API、SQL StreamInsight 临时事件流、F# 一类事件和异步工作流)编写复杂的事件处理查询。 有关 IObservable<T>/IObserver<T> 接口的详细信息,请参阅 探索 Rx 中的主要接口。 有关在 Rx 中使用不同功能的教程,请参阅 使用 Rx