zoukankan      html  css  js  c++  java
  • Reactive Extensions简介一

    .Net 4.0中引入了两个新的接口用来实现观察者模式——IObservableIObserverIObservable是数据源,IObserver是观察者,观察者订阅数据源后,当新的数据产生时,将其主动传给所有的订阅者(Iobserver)。

    观察者模式比较基础,因此在这里并不多加介绍,没有相关基础的朋友可以参看MSDN的这两个链接。

    Observer(观察器)

    探究观察者设计模式

    这里我用一个简单的实例介绍一下这个接口的基本用法。

        class Program

        {

            static void Main(string[] args)

            {

                var timerServer = new TimeServer();

                timerServer.Subscribe(new Watch());

     

                System.Threading.Thread.Sleep(-1);

            }

        }

     

        class TimeServer : IObservable<DateTime>

        {

            public TimeServer()

            {

                new System.Threading.Timer(_ => Notify(DateTime.Now), null, 0, 1000);

            }

     

            void Notify(DateTime time)

            {

                foreach (var observer in _observers)

                {

                    observer.OnNext(time);

                }

            }

     

            #region IObservable<DateTime> 成员

     

            List<IObserver<DateTime>> _observers = new List<IObserver<DateTime>>();

     

            public IDisposable Subscribe(IObserver<DateTime> observer)

            {

                //这里省略了参数有效性检查

                _observers.Add(observer);

                return new AnonymousUnSubscriber() { Action = () => _observers.Remove(observer) };

            }

     

            #endregion

     

            #region AnonymousUnSubscriber

     

            class AnonymousUnSubscriber : IDisposable

            {

                public Action Action { get; set; }

     

                void IDisposable.Dispose()

                {

                    this.Action();

                }

            }

     

            #endregion

        }

     

        class Watch : IObserver<DateTime>

        {

            #region IObserver<DateTime> 成员

     

            public void OnCompleted() { throw new NotImplementedException(); }

            public void OnError(Exception error) { throw new NotImplementedException(); }

     

            public void OnNext(DateTime value)

            {

                Console.WriteLine(value);

            }

     

            #endregion

        }

    这里定义了两个简单的对象:TimeServer是数据源,实现了IObservable接口,Watch是观察者,实现了IObserver接口。当有新数据产生时(定时器每秒钟通知一次),会调用WatchOnNext接口,将当前时间在屏幕上打印出来。

    像这种“推”的方式一般也被称作反应式(Reactive),虽然其接口比较简明,但在.Net 4.0中只有接口的声明,并没有其它的相关库函数进行支持。因此要实现反应式编程得自己实现所有其它的相关代码。不过好在微推出了一个名为Reactive Extensions for .NET (Rx)的库,实现了许多强有力的功能,使得我们能快速构建强大的反应式的程序。像上面的这个例子,用Rx库可以简化如下: 

        static void Main(string[] args)

        {

            var timerServer = Observable.Interval(TimeSpan.FromSeconds(1)).Select(_ => DateTime.Now);

            timerServer.Subscribe(i => Console.WriteLine(i));

     

            System.Threading.Thread.Sleep(-1);

        }

     

    Rx库非常强大,由于相关资料不多,目前我也是在学习和摸索中,后面还会写一些文章陆续介绍这个库。

  • 相关阅读:
    ReactiveCocoa 谈谈RACMulticastConnection
    ReactiveCocoa 谈谈concat
    Swift 一些环境配置
    hpple 简单使用
    Swift 学习手记1,pod 的 类库使用
    [转]SQL语句:Group By总结
    Jquery VailDate初探
    C#RSA加密解密详解
    电子印章制作管理系统 -升级版本
    tensorflow 实现的第一个目标检测模型
  • 原文地址:https://www.cnblogs.com/TianFang/p/2034083.html
Copyright © 2011-2022 走看看