真实世界中使用Rx的例子

24

可能是重复问题:
Reactive Extensions使用的好例子

我已经开始尝试使用响应式扩展(Reactive Extension)一段时间了,但主要限于在WPF前端处理/组合用户驱动事件。

这是一种强大的新型异步编程方法,我很好奇其他人正在使用它做什么,并且您认为它能够如何改进我们当前所做的事情?


API的波动很大,所以我在我的生产代码中没有使用Rx依赖,也不知道其他人是否这样做。 - Stephen Cleary
同意,我也遇到了Pex相同的问题,每个新版本都有很多更改,它会破坏我的代码。 - theburningmonk
Rx不是已经包含在VS 2010 / .NET 4中了吗?如果是的话,那就意味着我们可以依赖于一个稳定、广泛可用的基础。 - Damian Powell
@Damian,不,它没有包含在内。 - Richard Anthony Freeman-Hein
我在我的博客上的一系列文章中确切地回答了这个问题:http://rehansaeed.co.uk/reactive-extensions-part1-replacing-events/ - Muhammad Rehan Saeed
显示剩余2条评论
5个回答

39
我们已经在两个项目(Silverlight UI)中非常成功地使用了RX。一开始的意图是简化WCF访问层 (参考链接)。理性上说,即使最糟糕的情况下,我们也可以始终返回到标准的(回调)操作方式,而不会影响UI的更高级别。
我们毫不知情的是,RX就像一种令人上瘾的药物 - 一旦开始使用它,就无法回头。它像病毒一样迅速从低级通信层传播到UI组件:
- 我们从简单的语法糖开始,使访问WCF服务变得更加简单。 - 接着自然而然地将RX扩展到服务器到客户端异步消息传递。 - 然后将这两种客户端与服务器交互的方式合并成一个,使视图模型对接收消息的方式不加区分成为默认选项。 - 最后彻底沉溺其中:
- 需要处理乱序消息吗? - 需要在价格变动时闪烁网格中的单元格吗? - 因为客户端受到来自服务器的大量消息而出现性能问题? - 有一些基本的CEP逻辑需要处理吗?
好了,你猜怎么着,这些都有RX操作符来实现;)(如果没有-您可以轻松地编写一个)。所有人团队中最困难的部分是克服一开始经历的“我脑子痛到要裂开”的感觉。一个凡人大脑由多年的按此回调处理我的事件编码所训练,与 RX 看待世界的方式不同。因此,RX 代码(特别是当它在处理更加复杂的情景时变得越来越密集)对于一个未经准备的大脑来说,看起来像是完全的魔法,就像从貌似空无一物的帽子里拉出一只兔子那样有趣。不幸的是,在生产运行的代码中,没有魔法的位置,因此整个团队必须同心协力,这意味着每个人都必须经历这个痛苦的过程,以一种乍看起来非常不自然的方式重新连接他们的大脑。
我认为,有效采用 RX 的最大障碍是人类因素,而不是 RX API 本身。但付出的努力是绝对值得的!

2
+1 我完全同意。这有点像一个学习曲线,一旦你掌握了它,就像打开了一扇门,它无处不在。有点像 LINQ :) - Rangoric
3
我的经历和你差不多 ;) 我要补充的是对于一个新手来说,RX看起来像魔法,但对于已经适应了这个概念的人来说,它非常描述性。 - Sergey Aldoukhov

11

我已经为集成WPF / Silverlight和Rx编写了一个更完整的库,文档目前已经(编辑:不再)糟糕了!但是你可以在以下链接中查看:

http://www.reactiveui.net


可能需要更新链接。 - Bryan Anderson

3

Samuel McAraveyChannel9上发布了一段视频,描述了他使用RX构建的真实世界SilverLight应用程序。他甚至将其提供在CodePlex上

此外,以下是一些实际用途,即使您没有异步要求,也可以应用RX:

  • 如果您想允许用户通过列表滚动并在侧边显示一些详细信息,同步查询详细信息可能会影响滚动性能。这时可以使用Throttle()方法。
  • 有时您需要在用户停止输入后立即执行查找。同样,使用.Throttle方法就可以了。
  • 使用Routed Commmands in MVVM。非常适合在列表项上使用,只需指定CommandParameter =“ {Binding}”,然后就可以在容器级别上捕获它们。

不要脸地自我推销 - 这里有一个快速示例,演示如何在用户停止输入时运行一个函数:http://bryanmitchellanderson.com/2010/08/rx-running-a-function-when-the-user-stops-typing/ - Bryan Anderson
@Bryan Anderson:自荐并不是什么可耻的事情。至少Paul Betts在这方面绝对不这样认为 :-) - Fyodor Soikin
@Fyodor Soikin:没错,但是@Paul Betts的库在Silverlight或WPF应用程序中使用Rx时确实非常出色,所以并不会那么无耻。 - Bryan Anderson
@Bryan Anderson:在这个问题上,我不太同意。 - Fyodor Soikin
@Bryan Anderson @Fyodor Soikin:既然我们是无耻的自我推销者,这里有我的一个——http://netdots.wordpress.com/2010/11/03/making-list-navigation-responsive-using-reactive-extensionspart-1-throttle/ - Sergey Aldoukhov

3
我们在Silverlight应用程序中成功地使用Rx从后端加载数据。我们最近从SOAP服务平面XML生成迁移而来,Rx及时到来,使我们能够使用它代替WebClient或WebRequest(实际上我们现在将WebClient包装成Observable,但可能会转向WebRequest)。
几天前我们遇到了一个错误;我们意识到请求URL太长了,以至于被截断了。幸运的是,我们可以将请求拆分为多个,并连接响应,但如果仅使用WebClient解决这个问题,就意味着需要创建一个队列和状态机来按顺序处理请求...相反,使用Rx,我们可以简单地将请求分组,在调用SelectMany时完成我们之前所做的事情,然后就完成了! Rx来拯救我们了!

2

目前我最喜欢的Rx解决方案是将其用作事件聚合器。请看这里:

http://jfromaniello.blogspot.com/2010/04/event-aggregator-with-reactive.html

我将其应用到Silverlight上,并且它非常好用。令人惊奇的是其过滤事件的能力。例如,有些事件类型只是“string”,因为没有其他信息。我创建了一个类来公开这些常量(以便不会出现神秘字符串),例如BEGIN_BUSY(调用Web服务时)和END_BUSY(完成时)等。

订阅时,你可以直接执行:

(from e in EventAggregator.Subscribe<string>() where e.Equals(BEGIN_BUSY) select true).Subscribe( evt=> { // Listening only to the BEGIN_BUSY event }); 

太喜欢了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接