什么时候使用RX

主旨:针对使用.net事件模式来达到异步操做的开发人员使用RX带来的优点
RX的优点
不管是从事传统的桌面应用程序编程仍是基于网络的编程,你会时而不时的碰到异步操做。桌面应用程序开发确定要考虑到/O操做和前台线程可能花费很长的时间致使其它线程阻碍。Silverlight禁止任何阻塞线程调度,因此你只能选用异步编程模型。然而如今的异步编程模型用户必须手动的管理异常和取消事件.为组合和过滤事件也要本身编码来实现,这将会很难去维护和编译。
另外,若是你的程序是多数据互相交互,传统的解决方法是经过把每一个数据流做为一个单独的事件来进行管理的。例如:只要用户按下键盘,一个键盘事件将会推送到键盘事件的处理方法下。在这个键盘事件里面,你必须本身编码来过滤不一样的数据流来获取当前事件所须要的数据。
目前,若是你想订阅事件,首先你要先建立事件句柄,以后你就能够订阅这个事件,示例以下:编程

/// Declare an event
public event EventHandler<MouseEventArgs> MouseMove;
/// Publish data
MouseMove(this, args);
///Subscribe to an event
MouseMove += (sender, args) => Display(args)

 

使用Rx,你能够处理多数据异步操做(数据能够来自于股票,计算机,网络等),而且订阅事件流经过Iobserver<T>接口,接口 IObservable<T> 维护一个依赖Iobserver<T>这个接口的列表,而且当它的状态发生改变会自动的通知它们。你能够经过标准化队列查询方式(LINQ)来操做observable这个队列。这时,你能够容易的经过标准的LinQ操做来实现多事件的过滤,组合,联合,执行功能。异常和取消也在RX的扩展中实现。网络

下面的示例展现了如何建立一个ISubject实例来表明事件流,Isubject继承于IObservable和IObserver这两个接口。和上一个示例使用相同的对象参数和订阅关系。异步

///Declare an observable
public ISubject<MouseEventArgs> MouseMove;
///Publish data
MouseMove.OnNext(args);
///Subscribe to an observable
MouseMove.Subscribe(args => Display(args));

 


此外你可使用计划表功能来实现何是开始这种订阅关系,或者什么时候把通知推送给订阅者。
过滤
传统事件模式的一个缺点就是一但事件被引起,事件处理程序都会立马被调用。并且事件都必须由事件源发引起而后被发送出来。为了让事件处理函数只处理本身关注的数据引起的事件,必须本身在事件本身编码来转换数据。
如以检测鼠标按下事件为例,在如今的事件模型中,你必须写事件处理程序 而且要用MouseEventArgs来做为参数,应用程序能够对引起事件的消息作出回应。在RX中,鼠标按下事件被做为一种带有点击信息的流进行处理。不论你何是点击鼠标,这些信息都在准备处理的流中。经过这种范式,事件或者事件流很是像List或其它集合,这也意味着咱们能够把操做集合的方法用来操做事件。好比,你能够过滤掉鼠标在指定范围以外的点击,仅仅在范围内的点击才引起事件,或者你能够计算一段时间内点击 ,并把有效的点击 次数做为信息参数,相似的,你能够关注股票在必定时间的必定范围内的指数变化。这些经过RX很是容易实现。
经过这种方法,函数能够接收事件处理事件并把处理事件的流传递给应用程序。这将带给你在如今的编程模式中意想不到的灵活与方便。此外Rx还要充当管道功能来在后台过滤,异步,转换数据,你的事件处理函数只需处理收到的数据。这将会使你的代码是干净,易读和便于维护的。
组合
在如今的事件模式中,你几乎不能组合事件。不能订阅多下事件而且根据不一样的事件结果来进行异步操做。在Rx中,通常的LINQ操做如SelectMany,Merge,等等已经实现的组件中,这样操做只须要合并多个事件流去返回给订阅者,如你能够建立一个观察者队列来监听鼠标按下和鼠标移动事件,以后你能够订阅这个台山观察队列,因此这就基本上实现了组合鼠标事件,其实也就是鼠标拖动事件。
操做事件
如今的事件模式中,事件针对与另外一个服务交互(应用程序,函数,存储,进程)是隐藏数据源的,就像咱们前面讨论的那样,RX是作为一个对象集合的。如,鼠标事件包含一个点值的集合,基于观察者对象的性质,它们能够作为函数参数,返回值,或者存在变量中。
解除事件订阅
如今有事件模式中,为了中止接收事件通知,你必须明确的解除订阅事件。RX能够简单的让你在特定的时间和特定的数据源。如,当你订阅一个观察队列展示的事件流时,你能够指定你订阅多长时间这个队列改变或者订阅一个时间间隔如订阅3-5分钟的事件流。或者其它事件发生时才会订阅事件。另外,当你订阅一个观察队列时,你可能获得一个IDisposable句柄经过这个句柄你能够经过调用Dispose来解除订阅。异步编程

源文函数

相关文章
相关标签/搜索