Rx的真实世界的例子

时间:2010-05-20 22:10:11

标签: c# .net asynchronous system.reactive

  

可能重复:
  Good example of Reactive Extensions Use

我一直在玩Reactive Extension一段时间,但主要限于在WPF前端处理/编写用户驱动的事件。

这是一种强大的,新的异步编程方式,我很好奇其他人正在做什么,你认为它可以改善我们目前做事的方式?

6 个答案:

答案 0 :(得分:39)

我们已经在两个项目(Silverlight UI)上使用了RX取得了巨大成功。最初的意图是simplify the WCF access layer)理性的是,在更糟糕的情况下,我们总是可以恢复到标准(回调)方式,而不会影响更高级别的UI。

我们很少知道RX就像一种令人上瘾的药物 - 一旦你开始使用它,就不会再回来了。就像病毒一样,它会迅速从这个低级别的通信层传播到UI组件:

  • 我们从简单的语法糖开始,使访问WCF服务更简单。
  • 从那里将RX扩展到服务器到客户端的异步消息传递是一个自然的步骤
  • 之后使用RX将这两种方式合并为客户端与服务器进行通信,因此viewmodels对于如何接收消息是不可知的默认选项。

然后是完全投降:

  • 需要处理无序的消息吗?
  • 价格变动时需要在电网上闪一个单元吗?
  • 有性能问题,因为客户端受到来自服务器的消息的轰炸?
  • 有一些基本的CEP逻辑可以处理吗?

好吧,猜猜看,那里有RX操作员;)(如果没有 - 你可以很容易地写一个)

最难的部分就是要克服我们团队中每个人在开始时都经历过的“我的大脑疼痛 - 如此糟糕”的感觉。通过多年的处理 - 我的事件 - 通过这种回调编码来限制一个凡人的大脑,就像RX看世界一样。结果RX代码(特别是一旦它逐渐变得越来越密集,同时处理越来越复杂的场景)对于一个毫无准备的头脑看起来像完整的abracadabra有趣的确导致一只兔子从一个看似空洞的帽子中拉出来。不幸的是,现实是在生产代码中没有魔法的地方,所以整个团队必须在船上,这意味着每个人都必须经历这个痛苦的过程,重新调整他们的大脑,看起来像一个非常不自然的方式。

我认为这是一个人为因素而不是RX API本身,这是有效采用RX的最大障碍。但男孩是值得的!

答案 1 :(得分:11)

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

http://www.reactiveui.net

答案 2 :(得分:4)

我使用RX来实现以块的形式加载数据(比如sql server management studio)。 Using Reactive Extensions for Streaming Data from Database

答案 3 :(得分:3)

Samuel McAraveyvideo on Channel9描述他使用RX构建的真实SilverLight应用程序。他even made it available on CodePlex

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

  • 如果您希望允许用户滚动显示侧面某些详细信息的列表,查询详细信息 synchronousely 可能会损害您的滚动性能。 .Throttle()是你的朋友。
  • 有时您需要在用户停止输入后立即执行查找。同样的事情,使用.Throttle,你很好。
  • 使用Routed Commmands in MVVM。非常适合在列表项上使用,只需指定CommandParameter =“{Binding}”,您就可以在容器级别上捕获这些内容。

答案 4 :(得分:3)

我们在Silverlight应用程序中从后端加载数据时成功使用Rx。我们最近从服务器上的SOAP服务纯XML生成迁移,Rx及时到来,以便我们可以使用它而不是WebClient或WebRequest(实际上我们现在将WebClient包装在Observable中,但可能会转移到WebRequest)。

我们几天前发现了一个错误;我们意识到请求URL太长,以至于它们被截断了。幸运的是,我们可以将请求分成多个并连接响应,但仅使用WebClient解决这个问题意味着创建一个队列和一个状态机来按顺序处理请求...相反,使用Rx我们可以简单地将请求分组,做我们以前做过的事情,但是在致SelectMany的电话中,我们完成了! Rx救援!

答案 5 :(得分:2)

对于Rx,我现在最喜欢的解决方案可能是将其用作事件聚合器。看看这里:

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

我将其改编为Silverlight,它就像一个魅力。功能强大的是过滤事件的能力。例如,一个事件只是键入“字符串”,因为没有其他信息。我没有为每个简单事件创建强类型类,而是创建了一个暴露常量的类(因此没有魔术字符串) - 例如,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 }); 

喜欢它!