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

  • 相关阅读:
    制作Autorun的CD
    Sybase ASE MDA tables 装不上怎么办?
    对于TStringList.Find函数,我有话要说
    HH.exe CHM Operator Command.
    Delphi 7的一些常用的快捷键
    Explain Plan
    在Delphi中的Log
    subst windows下实用的磁盘映射工具
    Excel 2007 如何冻结多行&多列
    LinqToDataTable[转]
  • 原文地址:https://www.cnblogs.com/TianFang/p/2034083.html
Copyright © 2020-2023  润新知