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为我们来管理这些异步调用。

    public static void ObservableStart(int x, int y)
{
PlusTwoNumberAsync(x, y).Subscribe(Console.WriteLine);
Console.ReadKey();
} private static IObservable<int> 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<int> 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;

}


完整代码如下:

// -----------------------------------------------------------------------
// <copyright file="RxAsyncCall.cs" company="">
// TODO: Update copyright text.
// </copyright>
// ----------------------------------------------------------------------- namespace RxPractice
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reactive.Linq;
using System.Threading; /// <summary>
/// 异步调用
/// </summary>
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<int> 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<int> MultiplyByFiveAsync(int x)
{
return Observable.Return(MultiplyByFive(x));
} private static int MultiplyByFive(int x)
{
Thread.Sleep(5000);
return x * 5;
} private static IObservable<int> PlusTwoNumberReturnAsync(int x, int y)
{
return Observable.Return(PlusTwoNumber(x, y));
}
}
}

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. make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 错误 1,make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 错误 1

    错误3: g++: g++: selected multilib '32' not installed selected multilib '32' not installed make: *** [ ...

  2. Android 延时执行任务的三种简单方法

    开启一个新的线程 new Thread() { @Override public void run() { try { Thread.sleep(2000); } catch (Interrupted ...

  3. Android 图片圆角的简单方法

    package com.jereh.helloworld.activity.ui; import android.content.Context; import android.graphics.Ca ...

  4. Trigger和ViewStateManager的具体比较

    ViewStateManager的好处  拥有 GeneratedDuration ,可以很方便的进行几个状态之间的切换过渡动画. 坏处是,在界面加载时只能显示默认效果,通过GoToStateActi ...

  5. 移动web资源整理

    [原]移动web资源整理 2013年初接触移动端,简单做下总结,首先了解下移动web带来的问题 设备更新换代快--低端机遗留下问题.高端机带来新挑战 浏览器厂商不统一--兼容问题多 网络更复杂--弱网 ...

  6. DXUT源码阅读笔记

    14.GetCapture() 函数功能:该函数取得捕获了鼠标的窗口(如果存在)的句柄.在同一时刻,只有一个窗口能捕获鼠标:此时,该窗口接收鼠标的输入,无论光标是否在其范围内.函数原型:HWND Ge ...

  7. jQuery.lazyload

    Lazy Load延迟加载也有的称为惰性加载,是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它 ...

  8. 关于WM_GETTEXT的应用

    HWND hw = ::FindWindow(NULL,"Form1"); HWND hw2 = ::FindWindowEx(hw,NULL,NULL,NULL); int le ...

  9. phpstorm 10注释的双斜线位置不在缩进的位置:

    22:07 2016/4/4phpstorm 10注释的双斜线位置不在缩进的位置:终于找到了(但是没有实现效果,不知道是什么原因 win10系统):File | Settings | Editor | ...

  10. bzoj1968真·想sha法bi题

    本来想打表找规律的来着,,, 线性筛吗?一边筛一边累加答案?那不就不线性了吗...1e6悬啊 而且不是质因数个数而是因数个数,统计起来应该还要用数学方法 ...好尴尬 等一下,不要求质数的话我筛个p ...