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(观察器)
    探究观察者设计模式

  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/TianFang/p/1637774.html
Copyright © 2011-2022 走看看