何时使用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来解除订阅。

源文

时间: 2024-10-03 00:09:16

何时使用RX的相关文章

.Net并行编程 - Reactive Extensions(Rx)并发浅析

关于Reactive Extensions(Rx) 关于Reactive Extensions(Rx),先来看一下来自微软的官方描述: The Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators. Using Rx, developers represen

AMD:RX 480双卡就这样灭GTX 1080!

日前宣布新卡Radeon RX 480的时候,AMD做了一番性能演示,同时使用RX 480双卡.GTX 1080单卡跑DX12游戏<奇点灰烬>的基准测试,结果前者完胜. 要知道,GTX 1080只要199美元,两块加起来也不到400美元,GTX 1080的两个版本则是599/699美元. 那么,AMD是怎么做到的呢? AMD全球技术营销总监Robert Hallock特意对此做了详细解释,尤其是给出了测试平台配置: Core i7-5930K处理器.华擎X99M Killer主板.32GB D

82599网卡驱动rx descriptor结构体分析

82599 datasheet: 7.1.6  节    大概位于314页 对驱动的理解关键是对数据结构的理解. The 82599 posts receive packets into data buffers in system memory. The following controls are provided for the data buffers: ? The SRRCTL[n].BSIZEPACKET field defines the data buffer size. See

perl6正则 1: ~~ , //, m//, rx//

~~ perl6 中, 要匹配一个正则, 使用 ~~ 智能匹配符. > so 'abcde' ~~ /a.c/ True > so 'abcde' ~~ /a.d/ False > // 或 m 模式中, 默认用 // , 如果要改变, 像perl5一样加 m前缀就行. > ~('abcde' ~~ m! a. !) ab > rx// 如果我们要把正则保存到一个变量中, 可以用 rx // 创建一个表达式. > my $r = 'a.'; a. > $r a.

Reactive Extensions(Rx)并发浅析

Reactive Extensions(Rx)并发浅析 iSun Design & Code .Net并行编程 - Reactive Extensions(Rx)并发浅析 关于Reactive Extensions(Rx) 关于Reactive Extensions(Rx),先来看一下来自微软的官方描述: The Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs us

再见Flux, 欢迎Bacon/Rx?

Facebook的Flux和React.js刚刚变得很火,大有剿灭MVC之势,现在又有人提出再见Flux,新的Bacon/Rx有哪些优势呢? Facebook一年前引入Flux架构,它是客户端建立Web应用的最新革新,是对Angular.js的前端MVC的提升与革命,如今已经成为Web开发者最火热的技术. Flux是使用dispathcer将业务逻辑从用户界面中分离出来,核心思想是单向数据流,这意味着响应用户动作的事件的传播可以单向传遍整个系统,不需要绑定任何内部数据模型: 这种单向数据流与Re

【分享】初音岛(D.C.)系列(包括D.C.III RX初音岛3) 汉化硬盘版游戏

游戏内容: [040528][CIRCUS]D.C.P.C-ダ?カーポ-プラスコミュニケーション [汉化硬盘版].rar(2.7GB)[060415][CIRCUS]D.C.II 春风のアルティメットバトル! [汉化硬盘版].rar(321.9MB)[060526][CIRCUS]D.C.II-ダ?カーポII- [汉化硬盘版].rar(1.9GB)[061107][CIRCUS]D.C.II -featuring Yun2- [汉化硬盘版].rar(335MB)[070427][CIRCUS]D

RX系列五 | Schedulers线程控制

RX系列五 | Schedulers线程控制 在我们上一篇文章中的,我们的小例子里有这么一段代码 //网络访问 .observeOn(Schedulers.io()) 事实上,我们在使用网络操作的时候,便可以控制其运行在哪个线程中,而Schedulers类,有四个方法,分别是 Schedulers.immediate(); Schedulers.newthread(); Schedulers.io(); Schedulers.computation(); 以及RxAndroid中的Android

使用Rx缓存网络数据

欢迎Follow我的GitHub, 关注我的CSDN. RxJava是响应式编程, 在异步处理网络数据时, 使用广泛. 我们也可以使用一些Rx的特性, 优雅地缓存网络数据. 缓存模式: 读取数据库, 显示, 请求数据, 存储到数据库, 再更新页面. 使用Dagger2+Retrofit+Rx的标准组合, 我来讲解一下如何使用. GitHub下载地址 1. 框架 常规项目, 包含跳转缓存和非缓存页面, 为了模拟慢速环境, 延迟3秒加载数据. public class MainActivity ex

响应式编程(Reactive Programming)(Rx)介绍

很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它们都流于表面,从没有围绕响应式编程构建起一个完整的知识体系.库的文档往往也无法帮助你去了解它的函数.不信的话可以看一下这个: 通过合并元素的指针,将每一个可观察的元素序列放射到一个新的可观察的序列中,然后将多个可观察的序列中的一个转换成一个只从最近的可观察序列中产生值得可观察的序列. 天啊. 我看过