.Net中的反应式编程(Reactive Programming)

本文介绍了.Net中的反应式编程(Rx),它是使用LINQ风格的异步编程模型,结合Observables、LINQ和Schedulers。通过对比传统事件处理方式,展示了Rx如何使代码更具声明性。讨论了IObservable<T>和IObserver<T>在事件流中的作用,以及在UI编程中的应用,包括如何解决界面假死问题。此外,还探讨了IObservable<T>的谓词、创建方法以及Scheduler在异步中的角色。
摘要由CSDN通过智能技术生成

一、反应式编程(Reactive Programming)

1、什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LINQ风格编写基于观察者模式的异步编程模型。简单点说Rx = Observables + LINQ + Schedulers。

2、为什么会产生这种风格的编程模型?我在本系列文章开始的时候说过一个使用事件的例子:

1

2

3

4

5

6

7

8

9

var watch = new FileSystemWatcher();

  watch.Created += (s, e) =>

  {

      var fileType = Path.GetExtension(e.FullPath);

      if (fileType.ToLower() == "jpg")

      {

          //do some thing

      }

  };

这个代码定义了一个FileSystemWatcher,然后在Watcher事件上注册了一个匿名函数。事件的使用是一种命令式代码风格,有没有办法写出声明性更强的代码风格?我们知道使用高阶函数可以让代码更具声明性,整个LINQ扩展就是一个高阶函数库,常见的LINQ风格代码如下:

1

2

3

4

var list = Enumerable.Range(1, 10)

                .Where(x => x > 8)

                .Select(x => x.ToString())

                .First();

能否使用这样的风格来编写事件呢?

3、事件流
LINQ是对IEnumerable<T>的一系列扩展方法,我们可以简单的将IEnumerable<T>认为是一个集合。当我们将事件放在一个时间范围内,事件也变成了集合。我们可以将这个事件集合理解为事件流。

事件流的出现给了我们一个能够对事件进行LINQ操作的灵感。

二、反应式编程中的两个重要类型

事件模型从本质上来说是观察者模式,所以IObservable<T>和IObserver<T>也是该模型的重头戏。让我们来看看这两个接口的定义:

1

2

3

4

5

public interface IObservable<out T>

{

      //Notifies the provider that an observer is to receive notifications.

      IDisposable Subscribe(IObserver<T> observer);

}

1

2

3

4

5

6

7

8

9

10

11

public interface IObserver<in T>

{

    //Notifies the observer that the provider has finished sending push-based notifications.

    void OnCompleted();

    //Notifies the observer that the provider has experienced an error condition.

    void OnError(Exception error);

    

    //Provides the observer with new data.

    void OnNext(T value);

}

这两个名称准确的反应出了它两的职责:IObservable<T>-可观察的事物,IObserver<T>-观察者。

IObservable<T>只有一个方法Subscribe(IObserver<T> observer),此方法用来对事件流注册一个观察者。

IObserver<T>有三个回调方法。当事件流中有新的事件产生的时候会回调OnNext(T value),观察者会得到事件中的数据。OnCompleted()和OnError(Exception error)则分别用来通知观察者事件流已结束,事件流发生错误。

显然事件流是可观察的事物,我们用Rx改写上面的例子:

1

2

3

4

5

6

Observable.FromEventPattern<FileSystemEventArgs>(watch, "Created")

                .Where(e => Path.GetExtension(e.EventArgs.FullPath).ToLower() == "jpg")

                .Subscribe(e =>

                {

                    //do some thing

                });

注:在.net下使用Rx编程需要安装以下Nuget组件:

1

Install-Package Rx-main

三、UI编程中使用Rx

Rx模型不但使得代码更加具有声明性,Rx还可以用在UI编程中。

1、UI编程中的第一段Rx代码

为了简单的展示如何在UI编程中使用Rx,我们以Winform中的Button为例,看看事件模型和Rx有何不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值