博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Reactive Extensions(Rx) 学习
阅读量:6711 次
发布时间:2019-06-25

本文共 3438 字,大约阅读时间需要 11 分钟。

(著有多部编程书籍)和(Akka的缔造者和Typesafe的CTO)发表了“反应性宣言”,在其中尝试着。

这样的应用应该能够:

  • 对事件做出反应:事件驱动的本质,让反应性应用能够支持文中提到的若干特性。
  • 对负载做出反应:聚焦于可扩展性,而不是单用户性能。
  • 对失败做出反应:建立弹性系统,能够从各个层级进行恢复。
  • 对用户做出反应:综合上述特征,实现交互式用户体验。

在这份宣言公布之后,Scala的创造者、的创造者和Akka科技公司的领导者,在Coursera上发布了一套免费课程,名为“”:

该课程的目标在于讲授反应性编程的原理。反应性编程是一门新兴的学科,结合了并发、事件驱动和异步系统。对于编写任何类型的Web服务或分布式系统来说,它都至关重要;同时它在众多高性能并发系统中占有核心位置。反应性变成可以被视作高阶函数式编程对并发系统的自然拓展,通过协调和编排Actor交换的异步数据流,来处理分布的状态。

Reactive Extensions(Rx)的优点在于能够将传统的异步编程方式从支离破碎的代码调用中解放出来。Rx能够使的我们可以将异步代码写到一个单独的方法中,使得代码可读性和可维护性大大增强。

《》我们了解了Rx中的一些比较重要的操作符,本文中我们将会学习如何将Reactive Extensions(Rx)应用到我们的应用程序中。

同步方法调用是阻塞式的,在很多场景下这是不合适的。我们能够用Rx改造成异步调用。一个最简单的方法就是使用IObservable.Start方法,使得Rx为我们来管理这些异步调用。

public static void ObservableStart(int x, int y)        {            PlusTwoNumberAsync(x, y).Subscribe(Console.WriteLine);            Console.ReadKey();        }        private static IObservable
PlusTwoNumberAsync(int x, int y) { return Observable.Start(() => PlusTwoNumber(x, y)); } private static int PlusTwoNumber(int x, int y) { Thread.Sleep(5000); return x + y; }

除了Observable.Start外也可以使用Observable.Return来将同步方法改造为异步方法。只需要将上面的PlusTwoNumberAsync方法改为下面即可,运行程序的效果相同。

private static IObservable
PlusTwoNumberReturnAsync(int x, int y) { return Observable.Return(PlusTwoNumber(x, y)); }

使用SelectMany可以很方便的实现诸如在一个异步方法中调用另外一个异步方法的功能。

public static void ObservableSelectMany(int x, int y)

{
         PlusTwoNumberStartAsync(x, y).SelectMany(aPlusB => MultiplyByFiveAsync(aPlusB)).Subscribe(Console.WriteLine);
}
private static IObservable<int> MultiplyByFiveAsync(int x)
{
        return Observable.Return(MultiplyByFive(x));
}
private static int MultiplyByFive(int x)
{
       Thread.Sleep(5000);
       return x * 5;
}

完整代码如下:

// -----------------------------------------------------------------------// 
// TODO: Update copyright text.//
// -----------------------------------------------------------------------namespace RxPractice{ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reactive.Linq; using System.Threading; /// /// 异步调用 /// public class RxAsyncCall { public static void ObservableStart(int x, int y) { PlusTwoNumberStartAsync(x, y).Subscribe(Console.WriteLine); } public static void ObservableReturn(int x, int y) { PlusTwoNumberReturnAsync(x, y).Subscribe(Console.WriteLine); } public static void ObservableSelectMany(int x, int y) { PlusTwoNumberStartAsync(x, y).SelectMany(aPlusB => MultiplyByFiveAsync(aPlusB)).Subscribe(Console.WriteLine); } private static IObservable
PlusTwoNumberStartAsync(int x, int y) { return Observable.Start(() => PlusTwoNumber(x, y)); } private static int PlusTwoNumber(int x, int y) { Thread.Sleep(2000); return x + y; } private static IObservable
MultiplyByFiveAsync(int x) { return Observable.Return(MultiplyByFive(x)); } private static int MultiplyByFive(int x) { Thread.Sleep(5000); return x * 5; } private static IObservable
PlusTwoNumberReturnAsync(int x, int y) { return Observable.Return(PlusTwoNumber(x, y)); } }}

转载地址:http://rlxlo.baihongyu.com/

你可能感兴趣的文章
嵌入式系统 Boot Loader 技术内幕【转】
查看>>
(windows)一台电脑上安装两个Mysql服务
查看>>
教你如何在Kali Linux 环境下设置蜜罐?
查看>>
微信公众号开发之公众号支付
查看>>
主域控角色迁移和夺取(转载)
查看>>
HDFS High Availability Using the Quorum Journal Manager
查看>>
Sql日期时间格式转换
查看>>
mesos+marathon+zookeeper的docker管理集群亲手搭建实例(环境Centos6.8)
查看>>
你应了解的4种JS设计模式
查看>>
垃圾收集器Serial 、Parallel、CMS、G1
查看>>
mongodb基本概念解析
查看>>
前端学HTTP之网关、隧道和中继
查看>>
安卓手机使用Fiddler抓获HTTPS报文方法
查看>>
使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡
查看>>
Jenkins部署Web项目到远程tomcat(通过jenkins插件)
查看>>
数据机构与算法-数据结构的一些基本概念
查看>>
Google开源基于Tensorflow的NLP框架重大升级
查看>>
正则表达式工具RegexBuddy使用教程
查看>>
异常体系
查看>>
OpenCV【2】---读取png图片显示到QT label上的问题
查看>>