Bruce Eckel(著有多部编程书籍)和Jonas Boner(Akka的缔造者和Typesafe的CTO)发表了“反应性宣言”,在其中尝试着定义什么是反应性应用

这样的应用应该能够:

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

在这份宣言公布之后,Scala的创造者Martin OderskyReactive Extensions的创造者Erik Meijer和Akka科技公司的领导者Roland Kuhn,在Coursera上发布了一套免费课程,名为“反应性编程原理”:

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

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

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

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

  1. public static void ObservableStart(int x, int y)
  2. {
  3. PlusTwoNumberAsync(x, y).Subscribe(Console.WriteLine);
  4. Console.ReadKey();
  5. }
  6.  
  7. private static IObservable<int> PlusTwoNumberAsync(int x, int y)
  8. {
  9. return Observable.Start(() => PlusTwoNumber(x, y));
  10. }
  11.  
  12. private static int PlusTwoNumber(int x, int y)
  13. {
  14. Thread.Sleep(5000);
  15. return x + y;
  16. }

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

  1. private static IObservable<int> PlusTwoNumberReturnAsync(int x, int y)
  2. {
  3. return Observable.Return(PlusTwoNumber(x, y));
  4. }

使用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;

}


完整代码如下:

  1. // -----------------------------------------------------------------------
  2. // <copyright file="RxAsyncCall.cs" company="">
  3. // TODO: Update copyright text.
  4. // </copyright>
  5. // -----------------------------------------------------------------------
  6.  
  7. namespace RxPractice
  8. {
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Reactive.Linq;
  14. using System.Threading;
  15.  
  16. /// <summary>
  17. /// 异步调用
  18. /// </summary>
  19. public class RxAsyncCall
  20. {
  21. public static void ObservableStart(int x, int y)
  22. {
  23. PlusTwoNumberStartAsync(x, y).Subscribe(Console.WriteLine);
  24. }
  25.  
  26. public static void ObservableReturn(int x, int y)
  27. {
  28. PlusTwoNumberReturnAsync(x, y).Subscribe(Console.WriteLine);
  29. }
  30.  
  31. public static void ObservableSelectMany(int x, int y)
  32. {
  33. PlusTwoNumberStartAsync(x, y).SelectMany(aPlusB => MultiplyByFiveAsync(aPlusB)).Subscribe(Console.WriteLine);
  34. }
  35.  
  36. private static IObservable<int> PlusTwoNumberStartAsync(int x, int y)
  37. {
  38. return Observable.Start(() => PlusTwoNumber(x, y));
  39. }
  40.  
  41. private static int PlusTwoNumber(int x, int y)
  42. {
  43. Thread.Sleep(2000);
  44. return x + y;
  45. }
  46.  
  47. private static IObservable<int> MultiplyByFiveAsync(int x)
  48. {
  49. return Observable.Return(MultiplyByFive(x));
  50. }
  51.  
  52. private static int MultiplyByFive(int x)
  53. {
  54. Thread.Sleep(5000);
  55. return x * 5;
  56. }
  57.  
  58. private static IObservable<int> PlusTwoNumberReturnAsync(int x, int y)
  59. {
  60. return Observable.Return(PlusTwoNumber(x, y));
  61. }
  62. }
  63. }

Implementing the GeoCoordinateWatcher as a Reactive Service

Using Reactive Extensions for Streaming Data from Database

Bing it on, Reactive Extensions! – Story, code and slides

IntroToRx.com is the online resource for getting started with the  Reactive Extensions to .Net

http://rxdemo.codeplex.com/

http://blog.csdn.net/fangxinggood/article/details/7381619

Reactive Programming For .NET And C# Developers - An Introduction To IEnumerable, IQueryable, IObservable & IQbservable

Reactive Extensions(Rx) 学习的更多相关文章

  1. Reactive Extensions (Rx) 入门(5) —— Rx的事件编程

    译文:https://blog.csdn.net/fangxing80/article/details/7749907 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  2. Reactive Extensions (Rx) 入门(4) —— Rx的事件编程

    译文:https://blog.csdn.net/fangxing80/article/details/7685393 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  3. Reactive Extensions (Rx) 入门(3) —— Rx的事件编程

    译文:https://blog.csdn.net/fangxing80/article/details/7628322 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  4. Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions

    译文:https://blog.csdn.net/fangxing80/article/details/7581937 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  5. Reactive Extensions (Rx) 入门(1) —— Reactive Extensions 概要

    译文:https://blog.csdn.net/fangxing80/article/details/7381619 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  6. Reactive Extensions(Rx)并发浅析

    Reactive Extensions(Rx)并发浅析 iSun Design & Code .Net并行编程 - Reactive Extensions(Rx)并发浅析 关于Reactive ...

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

    关于Reactive Extensions(Rx) 关于Reactive Extensions(Rx),先来看一下来自微软的官方描述: The Reactive Extensions (Rx) is ...

  8. Rx (Reactive Extensions)

    The Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using ...

  9. Rx (Reactive Extensions)介绍

    Reactive Extensions (Rx) 原来是由微软提出的一个综合了异步和基于事件驱动编程的库包,使用可观察序列和LINQ-style查询操作. 使用Rx, 开发者可以用Observable ...

随机推荐

  1. Oracle SQL的硬解析和软解析

    我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也 ...

  2. c语言快速入门1

    如果你想快速入门计算机,可以参考我的上一篇帖子,先了解一些必备的软知识,然后再来进行语言的快速入门 计算机入门基础知识 目录 1.1.1    计算机与程序 现代计算机可以自动完成计算任务 程序就是按 ...

  3. sql 语句

    INSERT 基本语法:INSERT INTO table_name VALUES(value1,value2,value3,...); 指定列:INSERT INTO table_name(colu ...

  4. qtranslate

    qtranslate可以帮助用户快速的建立多语言网站平台,qTranslate 插件就是一个功能强大的 WordPress 多语言插件. 它允许用户在配置页添加新的语言.在 URL 结构方面,qTra ...

  5. 【Hibernate框架】对象的三种持久化状态

    一.综述 hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象).PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线 ...

  6. ibatis order by 防止sql注入

    (1) 排序控制 select TABLE_NAME, TABLESPACE_NAME from user_tables order by TABLE_NAME $ordertype$ Where t ...

  7. 关于WORD文档的读取乱码问题

    一直以来都是用File类操作txt文档,今天想尝试能不能打开word文档,无奈,尝试了UTF8,Unicode,Default....等编码方式,打开文件都是乱码,电脑甚至发出警报声. 以下只取一种编 ...

  8. js闭包

    先从闭包特点解释,应该更好理解. 闭包的两个特点: 1.作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态.2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 其实上面两点可以合成一 ...

  9. Linux Crontab语法

    Crontab语法 Lists 链表值 : 逗号,表示并列,要依次序;Examples:"1,2,5,9", "0-4,8-12". Ranges of num ...

  10. pair的使用

    #include<iostream> #include<cmath> #include<cstdio> #include<algorithm> #inc ...