zoukankan      html  css  js  c++  java
  • Reactive Extensions for .NET (Rx)

    LINQ to Object使用IEnumerable和IEnumerator两个接口来迭代数据集。枚举器的MoveNext()方法用于从前一个元素枚举到下一个元素,而Current属性则用于检索个别的元素。这种机制采取广泛使用的简洁易懂的"拉(pull)"过程。与之还有一种对应的"推"模式:一个是可以从集合中提取数据,同时可以把数据推进同样的集合。

    理论上来说,IEnumerable接口可对集合添加对象,但是由于它的阻塞性所以不能在异步操作中进行。.Net 4.0中引入了两个新的接口:IObservable和IObserver。人们可以把IObserver赋给数据集并把它作为IObservable订阅。当一项新的数据可用时,就可以通过传递IObservable来把它压进集合,接着再传给Iobserver。如下是一个简单的示例:

        class Program
        {
            public static void Main()
            {
                new NumbersObservable(new[] { 2, 3, 4 }).Subscribe(new DebugObserver());
            }
        }

        internal class AnonymousDisposable : IDisposable
        {
            internal Action Action { get; set; }
            void IDisposable.Dispose()
            {
                this.Action();
            }
        }

        class NumbersObservable : IObservable<int>
        {
            public NumbersObservable(IEnumerable<int> numbers)
            {
                this._numbers = numbers;
            }

            private IEnumerable<int> _numbers;
            public IDisposable Subscribe(IObserver<int> observer)
            {
                foreach (int number in _numbers)
                {
                    observer.OnNext(number);
                }
                observer.OnCompleted();
                return new AnonymousDisposable { Action = () => { ; } };
            }
        }

        class DebugObserver : IObserver<int>
        {
            public void OnNext(int value) { Console.WriteLine("{0}", value); }
            public void OnCompleted() { Console.WriteLine("all done."); }
            public void OnError(Exception ex) { Console.WriteLine("Whoops exception, I'd better throw."); throw ex; }
        }

    这种方法在处理事件的时候有着极大的优势。我们可以把IObserver附加到鼠标事件并对这些事件异步记录到一个集合当中。接着就可以使用LINQ来迭代数据,并进行相应的处理。要说明它在处理GUI事件的威力。上面只是一个简单的示例,Reactive Extensions实现了更多更为强大的功能,.net 3.5和.net 4.0 (最终会作为.net 4.0的一部分随VisualStudio2010一起发布)的Beta版可以在DevLabs: Reactive Extensions for .NET (Rx)下载。

    另外,关于Reactive Extensions的示例,可以参看以下这个网页:
    .NET 的 Reactive Extension (Rx)

    关于观察者模式的介绍,可以参看这两篇文章:
    Observer(观察器)
    探究观察者设计模式

  • 相关阅读:
    挖地雷
    图的遍历
    数字三角形
    小凯的数字
    开心的金明
    ACM Training DAY 1
    ACM模板大整理
    [Java程序设计基础] Day 1 实验课 Java的环境配置与Java数组
    #寒假集训[20200113]
    #寒假集训[20200112]
  • 原文地址:https://www.cnblogs.com/TianFang/p/1637774.html
Copyright © 2011-2022 走看看