Rx:2-Observable more

上一篇举了这个例子:

   1:  static void Main(string[] args)
   2:          {
   3:              var observables = Observable.Interval(TimeSpan.FromMilliseconds(30)).TakeWhile(p => p <= 100);
   4:              var newObservable = observables.Select(p => --p);
   5:              observables.Subscribe(p => Console.WriteLine(p));
   6:              newObservable.Subscribe(c => Console.WriteLine("\t" + c));
   7:              Thread.Sleep(3000);
   8:              Console.WriteLine("start");
   9:              Console.ReadLine();
  10:          }

这段代码里其实注意一下,我们有两个Observer,他们的工作职责都是一个,Console.WriteLine,这个方法在多线程里调用是没有问题的,但是从维护线程安全的复杂工作上来讲,我们更希望有一个single thread专门用来做Console.WriteLine,也就是说其实IObserver<T>就是把多线程的状态在它身上给隐藏掉了,与IObserver<T>交互的程序就可以不用考虑多线程的问题。简化了编码的复杂度和难度。

当然在上一篇blog里也说了多个IObservable<T>可以都Subscribe到一个IObserver<T>上,不过通过扩展方法,可以很轻松的完成这个任务:

static void Main(string[] args)
        {
            var observables = Observable.Interval(TimeSpan.FromMilliseconds(30)).TakeWhile(p => p <= 100);
            var newObservable = observables.Select(p => --p);

            var doLotsOfWorkObserver = Observable.Merge(observables, newObservable).Subscribe(p => Console.WriteLine(p));

            Thread.Sleep(3000);
            Console.WriteLine("start");
            Console.ReadLine();
        }

多个IObservable<T>都用一个IObserver<T>做响应是一件很长做的事情。虽然两者都是可以多对多的,但是复杂的关系一般比较难维护。而多线程所负责的业务往往不是CPU Bound的,所以多个IObservable<T>对应一个IObserver<T>通常来讲都是最常用的方式。

posted @ 2010-05-29 23:23  new 维生素C.net()  阅读(842)  评论(0编辑  收藏  举报