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>通常来讲都是最常用的方式。