Reactive Extensions(Rx) 学习
Bruce Eckel(著有多部编程书籍)和Jonas Boner(Akka的缔造者和Typesafe的CTO)发表了“反应性宣言”,在其中尝试着定义什么是反应性应用。
这样的应用应该能够:
- 对事件做出反应:事件驱动的本质,让反应性应用能够支持文中提到的若干特性。
- 对负载做出反应:聚焦于可扩展性,而不是单用户性能。
- 对失败做出反应:建立弹性系统,能够从各个层级进行恢复。
- 对用户做出反应:综合上述特征,实现交互式用户体验。
在这份宣言公布之后,Scala的创造者Martin Odersky、Reactive 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://blog.csdn.net/fangxinggood/article/details/7381619
Reactive Extensions(Rx) 学习的更多相关文章
- Reactive Extensions (Rx) 入门(5) —— Rx的事件编程
译文:https://blog.csdn.net/fangxing80/article/details/7749907 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- Reactive Extensions (Rx) 入门(4) —— Rx的事件编程
译文:https://blog.csdn.net/fangxing80/article/details/7685393 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- Reactive Extensions (Rx) 入门(3) —— Rx的事件编程
译文:https://blog.csdn.net/fangxing80/article/details/7628322 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions
译文:https://blog.csdn.net/fangxing80/article/details/7581937 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- Reactive Extensions (Rx) 入门(1) —— Reactive Extensions 概要
译文:https://blog.csdn.net/fangxing80/article/details/7381619 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- Reactive Extensions(Rx)并发浅析
Reactive Extensions(Rx)并发浅析 iSun Design & Code .Net并行编程 - Reactive Extensions(Rx)并发浅析 关于Reactive ...
- .Net并行编程 - Reactive Extensions(Rx)并发浅析
关于Reactive Extensions(Rx) 关于Reactive Extensions(Rx),先来看一下来自微软的官方描述: The Reactive Extensions (Rx) is ...
- Rx (Reactive Extensions)
The Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using ...
- Rx (Reactive Extensions)介绍
Reactive Extensions (Rx) 原来是由微软提出的一个综合了异步和基于事件驱动编程的库包,使用可观察序列和LINQ-style查询操作. 使用Rx, 开发者可以用Observable ...
随机推荐
- 10gRAC vip启动报错CRS-1006 CRS-0215
为测试一个迁移方案,装了一套10g rac环境,可能是很久没有装过10g的RAC了,整个过程情况不断. 1.在把集群软件和数据库软件都装好之后,用crs_stat检测状态的时候,发现vip的状态不对, ...
- JS实现常用排序算法—经典的轮子值得再造
关于排序算法的博客何止千千万了,也不多一个轮子,那我就斗胆粗制滥造个轮子吧!下面的排序算法未作说明默认是从小到大排序. 1.快速排序2.归并排序3.冒泡排序4.选择排序(简单选择排序)5.插入排序(直 ...
- 使用WCF 创建 Rest service
REST SERVICE 允许客户端修改url路径,并且web端功过url 请求数据. 他使用http协议进行通讯,想必大家都知道 . 并且我们可以通过设置进行数据类型转换, 支持XML,JSON 格 ...
- (UWP开发)更为合理的一种ListView下拉刷新(PullToRefresh)实现方法
最近在做的一个项目需要用到下拉刷新,但是参考了现在网络上比较普遍的方法,觉得都不太好,因为要在外部套上一个SrollViewer,容易出现滚动错误.于是刚开始的时候就把思路定到了ListView内部的 ...
- DataFrame格式化
1.如果是格式化成Json的話直接 val rdd = df.toJSON.rdd 2.如果要指定格式需要自定义函数如下: //格式化具体字段条目 def formatItem(p:(StructFi ...
- (转)论python工厂函数与内建函数
所谓工厂函数就是指这些内建函数都是类对象, 当你调用它们时,实际上是创建了一个类实例. 工厂函数: int(),long(),float(),complex(),bool() str(),unic ...
- Linux学习笔记(13)-进程通信|命名管道
匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...
- 树链剖分+线段树 HDOJ 5029 Relief grain(分配粮食)
题目链接 题意: 分粮食我就当成涂色了.有n个点的一棵树,在a到b的路上都涂上c颜色,颜色可重复叠加,问最后每一个点的最大颜色数量的颜色类型. 思路: 首先这题的输出是每一个点最后的情况,考虑离线做法 ...
- 解决Ubuntu安装openssh-server依赖问题
sudo apt-get install openssh-server 提示:openssh-server : 依赖: openssh-client (= 1:6.6p1-2ubuntu1) 解决 u ...
- BZOJ4455: [Zjoi2016]小星星
Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这 ...