本系列学习在.NET中的并发并行编程模式,实战技巧

本小节开始学习反应式编程。本系列保证最少代码呈现量,虽然talk is cheap, show me the code被奉为圭臬,我的学习习惯是,只学习知识点,代码不在当下立马要用的时候不会认真去读的,更何况在大多时候在手机阅读更不顺畅。

内容目录

1、反应式编程2、.NET中的工具3、Reactive Extensions(Rx)反应式扩展通过nuget安装Rx4、Rx主要用处GUI编程中合并事件Timer通知事件

1、反应式编程

就是将事件作为数据流异步地监听和处理的一种编程范式。类似编辑Excel表格时,某个单个元的值是由其他单元格值决定的公式,一旦其他单元格的值发生变化,此公式单个格也会随之更新。

如果以声明式描述操作,那么就是函数式反应型编程。

反应式编程的好处就是通过描述一种简单且可维护的方法来处理异步、无阻赛计算和IO,从而增加了对多核和多CPU硬件上计算资源的使用。事件的控制从“请求”变为了“等待”。大数据实时流处理环境,都会使用到反应式编程,例如推文系统处理,日志系统收集等。

2、.NET中的工具

.NET中是有基于委托的模型事件的。订阅者的事件处理程序注册一系列事件,并在调用时触发事件。类似桌面应用程序中经常使用Button的Click事件,通过使用+=来注册绑定事件。所以传统意义上的事件就是来处理GUI用户界面的交互。这种命令式编程难以处理多个复杂事件的编排,并且容易造成内存泄漏。

在F#中使用|>管道操作符可以连接多个事件。不熟悉F#,就不多做说明。主要看看C#如果处理。

3、Reactive Extensions(Rx)反应式扩展

LINQ 是 对 序 列 数 据 进 行 查 询 的 一 系 列 语 言 功 能。 内 置 的 LINQ to Objects( 基 于 IEnumerable) 和 LINQ to Entities( 基 于 IQueryable) 是 两 个 最 常 用 的 LINQ 提 供 者。另外还有很多提供者,并且大多数都采用相同的基本架构。查询是延后执行的,只有在需要时才会从序列中获取数据。从概念上讲,这是一种拉取模式。 在查询过程中数据项是被逐个拉取出来的。

Reactive Extensions(Rx)把事件看作是依次到达的数据序列。因此,将 Rx 认作是 LINQ to events( 基 于 IObservable) 也 是 可 以 的, 它 与 其 他 LINQ 提 供 者 的 主 要 区 别 在 于, Rx 采用推送模式。就是说,Rx 的查询规定了在事件到达时程序该如何响应。Rx 在 LINQ 的基础上构建,增加了一些功能强大的操作符,作为扩展方法。

通过nuget安装Rx

Observable和Enumerable是对偶存在,很多方法相似可以相互转换。像下面输出结果都是1-5

// Observable对象
Observable.Range(1, 5)
  .Subscribe(x => Console.WriteLine(x));

// Enumerable对象
foreach (var x in Enumerable.Range(1, 5))
  Console.WriteLine(x);

Rx里主要的接口有两个,IObervable和 IObserver,上面Observable遍历输出只是简化了IObserver对象的创建,Subscribe方法可以只传入OnNext委托,也可以传入完整的IObserver对象。

public interface IObservable<out T>
{
  IDisposable Subscribe(IObserver<T> observer);
}

public interface IObserver<in T>
{
  void OnCompleted();
  void OnError(Exception error);
  void OnNext(T value);
}
var observer = Observer.Create<int>(
  x => Console.WriteLine(x), // onNext参数(delegate)
  ex => { throw ex; }, // onError参数(delegate)
  () => { });  // onCompleted参数(delegate)

Observable.Range(1, 5).Subscribe(observer);

4、Rx主要用处

Rx的有点主要在于能够将传统的异步编程方式从支离破碎的代码调用中解放出来,将各个事件的处理连接起来放在一个单独的方法中,增加代码可读和可维护。

GUI编程中合并事件

桌面编程中多个事件进行组合的情况,比如鼠标按下/移动/放开事件进行关联处理,一般可能需要定一个变量Flag来标记状态,管理比较混乱。Rx可以将它们合成一个事件。

var drag = from down in this.MouseDownAsObservable()
                       from move in this.MouseMoveAsObservable().TakeUntil(this.MouseUpAsObservable())
                       select new { move.X, move.Y };
// 利用扩展方法将Winform原有的事件变换为 IObservable<T> 对象
    public static class FormExtensions
    {
        public static IObservable<MouseEventArgs> MouseMoveAsObservable(this Form form)
        {
            return Observable.FromEventPattern<MouseEventArgs>(form, "MouseMove").Select(e => e.EventArgs);
        }

        public static IObservable<MouseEventArgs> MouseDownAsObservable(this Form form)
        {
            return Observable.FromEventPattern<MouseEventArgs>(form, "MouseDown").Select(e => e.EventArgs);
        }

        public static IObservable<MouseEventArgs> MouseUpAsObservable(this Form form)
        {
            return Observable.FromEventPattern<MouseEventArgs>(form, "MouseUp").Select(e => e.EventArgs);
        }
    }

Timer通知事件

在一定的时间间隔监视某个值的场景。下面例子中就是每隔5s检查textbox值是否变化,变化了就更新label。比以往简介了很多

// 每隔1秒监视一下watchTarget.Value的值
var polling =
  Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(5))
  .Select(_ => textBox1.Text)
  .DistinctUntilChanged(); // 只有在值发生变化时才引发事件(polling)
polling.Subscribe(msg => this.Invoke(new Action<string>((e) => this.label1.Text = e),msg));

先这样草草结束吧,用到了再去详细研究下。像Rx是以往没听过的概念,有些场景中确实好用,但习惯了以往的方式,也比较难尝试,慢慢破圈慢慢生成吧。

今天报名增驾了三轮摩托车,准备过一把骑士的瘾,客官老爷们有摩友的,可以交流交流

to be contiued!
下集:任务异步模型

写给普通:

你以为我没回头

我以为你没挽留

年轻的想法还是尽早安排落地

.NET并发编程-反应式编程的更多相关文章

  1. iOS-函数式编程 && 响应式编程概念

    作为一个iOS developer,那么你一定用过Masnory / SnapKit: Masonry是一个OC开发中,非常好用的自动布局的第三方框架: SnapKit是Masonry团队打造的swi ...

  2. 函数式编程--响应式编程 ---android应用例子

    RxJava implements this operator as create. It is good practice to check the observer’s isUnsubscribe ...

  3. 【响应式编程的思维艺术】 (1)Rxjs专题学习计划

    目录 一. 响应式编程 二. 学习路径规划 一. 响应式编程 响应式编程,也称为流式编程,对于非前端工程师来说,可能并不是一个陌生的名词,它是函数式编程在软件开发中应用的延伸,如果你对函数式编程还没有 ...

  4. RxJava(一):响应式编程与Rx

    一,响应式编程 响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式. 1.1 异步编程 传统的编程方式是顺序执行的,必须在完 ...

  5. 浅谈Spring 5的响应式编程

    这篇使用Spring 5进行响应式编程的入门文章展示了你现在可以使用的一些新的non-blocking, asynchronous.感谢优锐课老师给予的指导! 近年来,由于响应式编程能够以声明性的方式 ...

  6. 深入浅出-iOS函数式编程的实现 && 响应式编程概念

    简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 配图 ...

  7. [HMLY]11.iOS函数式编程的实现&&响应式编程概念

    简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 作为一 ...

  8. Mybatis笔记二:接口式编程

    目录 旧方法的弊端 接口式编程 接口式编程的好处 接口式编程的增删改查 旧方法的弊端 在Mybatis笔记一中,我们使用命名空间+id的方式实现了Mybatis的执行,不过这里的命名空间是我们随便写的 ...

  9. Angular4学习笔记(五)- 数据绑定、响应式编程和管道

    概念 Angular中的数据绑定指的是同一组件中控制器文件(.ts)与视图文件(.html)之间的数据传递. 分类 流向 单向绑定 它的意思是要么是ts文件为html文件赋值,要么相反. ts-> ...

随机推荐

  1. docker+prom+grafana+altermanager

    docker基础 docker run -it --name centos -v $HOME:/tmp -p 8080:8080 centos docker inspect container #查看 ...

  2. 服务注册与发现-Eureka (高可用设计)

    什么是高可用 部署需要考虑的是什么: 1.系统遇到单点失效问题,如何能够快速切换到其他节点完成任务 2.如何应对网络故障,即系统如何设计成"故障开放型"(expecting fai ...

  3. kubernetes进阶(三)服务发现-coredns

    服务发现,说白了就是服务(应用)之间相互定位的过程. 服务发现需要解决的问题: 1.服务动态性强--容器在k8s中ip变化或迁移 2.更新发布频繁--版本迭代快 3.支持自动伸缩--大促或流量高峰 我 ...

  4. Jenkins管理员密码忘记修改操作

    一.Jenkins管理员密码忘记 当jenkins忘记了管理用户的密码时,只能通过修改配置文件并重启的方式初始化设置用户名及密码,操作如下: [root@localhost jenkins]# vim ...

  5. 一个C++源文件从文本到可执行文件经历的过程

    一个C++源文件从文本到可执行文件经历的过程 以Hello World为例进行说明 首先我们编写一个cpp源程序 test.cpp #include <iostream> using na ...

  6. 洛谷p2216 多次单调队列,扫描矩阵中的最大值减去最小值最的固定大小子矩阵

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

  7. 记一次小米手机安装Google Play(其他手机类似)

    记一次小米手机安装Google Play(其他手机类似) 最近换了一款小米10青春版,性价比很高,对于开发者而言,手机自带商店的软件内容往往不能满足需求,而需要单独定制习惯性的APP,博主通过最近的尝 ...

  8. vue 单文件组件最佳实践

    vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...

  9. how to remove duplicates of an array by using js reduce function

    how to remove duplicates of an array by using js reduce function ??? arr = ["a", ["b& ...

  10. styled-components all in one

    styled-components all in one CSS in JS https://www.styled-components.com/ https://github.com/styled- ...