首页 > 学院 > 开发设计 > 正文

Rx应用场景

2019-11-06 06:44:09
字体:
来源:转载
供稿:网友

本文主要描述使用Rx对当前使用.net事件模型和异步编程的好处。

使用Rx的优点

  无论是你处理传统的桌面程序还是基于Web的应用程序,你都必须时不时地处理异步编程。桌面程序的I/O操作或者UI线程,可能需要很长时间才能完成,而在完成过程中可能阻塞其他的线程。Silverlight禁止任何阻塞线程的调用,你唯一可以做的就是使用异步编程。 然而,现代异步编程模型的用户必须手动管理事件的异常和取消。 要编写或过滤事件,他必须编写难以阅读和维护的自定义代码。

  此外,如果您的应用程序与多个数据源交互,管理所有这些交互的常规方法是对每个数据流实现单独的方法作为事件处理程序。 例如,一旦用户键入一个字符,keydown事件就被推送到您的keydown事件处理程序方法。 在这个keydown事件处理程序中,你必须提供代码来响应这个事件,或者协调所有不同的数据流,并将这些数据处理成可用的形式。      如果您要订阅某个事件,您首先创建一个事件处理程序,然后您可以按照以下代码订阅该事件。

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

  使用Rx,您可以表示多个异步数据流(来自不同来源,例如股票报价,tweet,计算机事件,Web服务请求等),并使用IObserver<T>界面订阅事件流。 IObservable 接口维护从属IObserver 接口的列表,并自动通知它们任何状态变化。 您可以使用由Observable类型实现的标准LINQ查询运算符查询可观察序列。 因此,您可以通过使用这些静态LINQ运算符,轻松地对多个事件进行过滤,项目,聚合,组合和执行基于时间的操作。 还可以通过使用由Rx提供的扩展方法来优雅地处理取消和异常。      以下示例创建一个表示事件流的ISubject实例(它继承了IObservable和IObserver)。 然后它使用相同的对象发布数据和接收订阅。 有关使用主题的更多信息,请参阅使用主题。   

///Declare an observablepublic ISubject<MouseEventArgs> MouseMove;///Publish dataMouseMove.OnNext(args);///Subscribe to an observableMouseMove.Subscribe(args => Display(args));

  您还可以使用调度程序来控制订阅何时开始,以及何时将通知推送到订阅者。 有关此的详细信息,请参阅使用计划程序。  

过滤

  基于.NET事件的模型的一个缺点是,每当一个事件被触发时,事件处理程序总是被调用,并且事件完全按照源发出的方式到达。 要过滤掉您不感兴趣的事件或在调用处理程序之前转换数据,您必须向处理程序添加自定义过滤器逻辑。      以检测鼠标按下的应用程序为例。在当前事件编程模型中,您必须编写一个事件处理程序,将MouseEventArgs作为参数。应用程序可以通过显示消息来响应所引发的事件。在Rx中,此类鼠标按下事件被视为点击信息流。每当您点击鼠标时,关于此点击的信息(例如,光标位置)就会显示在流中,随时可以处理。在这个范例中,事件(或事件流)非常类似于列表或其他集合。这意味着我们可以使用处理集合的技术来处理事件。例如,您可以过滤出现在特定区域之外的点击,并且只有在用户点击某个区域时才显示一条消息。或者,您可以等待特定时间段,并通知用户此期间的“有效”点击次数。类似地,您可以捕获股票行情,并仅响应在特定时间窗口内针对特定范围更改的那些行情。所有这些都可以通过使用由Rx提供的静态LINQ查询类型运算符来轻松完成。   这样,函数可以获取事件,处理它,然后将处理的流传递给应用程序。 这提供了当前编程模型中不可用的灵活性。 此外,由于Rx在后台执行所有管道工作以过滤,同步和转换数据,因此您的处理程序只能对接收的数据做出反应,并对其进行处理。 这导致更干净的代码更容易阅读和维护。 有关过滤的更多信息,请参阅使用LINQ运算符查询可观察序列。   

构成

  在基于.NET事件的模型中,事件无法轻松构成。 您不能订阅多个事件并基于输出合成结果。 在Rx的世界中,在组件中实现了诸如SelectMany,Merge等通用LINQ操作符。 这些运算符使您能够组合多个事件流,以向订阅者返回有意义的内容。 例如,您可以创建一个可观察的序列,同时监听鼠标向下和鼠标移动事件。 然后你可以订阅这个可观察的序列,这样你得到的是一个组合的鼠标拖动事件。 有关撰写的更多信息,请参阅使用LINQ运算符查询可观察序列。   

操纵事件

  在基于.NET事件的模型中,事件是隐藏的数据源,不能交给另一个服务,应用程序或函数进行存储或进一步处理。 正如我们前面所讨论的,Rx将事件表示为对象的集合:例如,MouseMove事件包含Point值的集合。 由于可观察值的第一类对象性质,它们可以作为函数参数传递并返回,或存储在变量中。   

取消订阅活动

  在基于.NET事件的模型中,要停止接收事件的通知,必须显式取消注册事件处理程序。 Rx通过允许您指定对数据源感兴趣的时间长度,使此任务更简单。 例如,当您订阅表示事件流的可观察序列时,您可以指定希望从序列中通知更改的时间长度(例如,n次迭代,或者类似于“在3之间不推”的时间间隔 -5pm“,或当其他事件发生时)。 此外,当您订阅可观察序列时,您将获得一个IDisposable句柄,您可以使用该句柄取消订阅(通过调用Dispose)到该序列。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表