Observable.Never
Observable.Never<T>()方法返回无限(不终结的)不返回任何消息的sequence(队列):
Observable.Throw
Observable.Throw<T>(Exception)需要类型参数信息,还有Exception参数供OnError使用。该方法创建一个只有一个OnError消息的队列,并将Exception参数传入方法。
Observable.Create
该方法允许你指定一个委托,在subscriptions(订阅物)被创建时调用。创建subscriptions(订阅物)的IObserver<T>会把委托传递给你,使你在需要时可以调用OnNext/OnError/OnCompleted方法。这是为数不多的几个你需要自己管理 IObserver<T>对象的情况中的一个。传递给你的是一个Func委托,它返回一个IDisposable对象,用于在subscriber(订阅者)disposes他们的subscriptions(订阅物)时调用的Dispose()方法。
Create方法是创建自定义可观测物对象的首选方法。Subjects的应用场景大部分停留在样例和测试领域,Subjects是学习RX很好的方式,能减小学习曲线,然而有些问题必须通过Create方法消除。RX采用了函数式编程范式,使Subjects意味着我们必须实时管理状态,存在潜在的变异的可能性(状态变异和异步编程是很难处理正确的);此外许多操作器(扩展方法)已经被仔细的确认保持了subscriptions(订阅物)和生命周期的一致性,而使用Subjects则有可能会破坏这些一致性。
在下面的例子中,我们将展示如何通过标准阻塞和eagerly evaluated(积极求值)调用返回一个sequence(队列):
然后再展示如何通过lazy evaluation(惰性求值)返回observable sequenc(可观测物队列)而不进行阻塞:
当订阅者调用eagerly evaluated(积极求值)、blocking方法时,即使是最快的IObservable<string>也最少阻塞1秒后才能收到,无论是否订阅者是否自动订阅到IObservable<string>。而非阻塞方式采用了lazily evaluated(惰性求值),所以可以立即收到。
下面是Empty, Return, Never和Throw 这几个方法各自使用Observable.Create进行创建的例子:
Observable.Create提供了自由的创建你所需要的工厂方法的可能性,上面的这些例子都在产生了OnNext或OnError\OnCompleted消息后了返回IDisposable类型的subscriptions token(订阅物 token),但返回的token都是Disposable.Empty由产生的在Dispose时不做任何处理的实例,这也使得这个token变得没有什么实际意义。接下来我们来看一看如何有效的利用返回值。
在下面的例子中我们利用了Observable.Create方法在创建实例时传入了一个委托,并在委托内部创建了一个在observer(观察者)的OnNext方法被调用时计时的计时器:
Output:
tick
01/01/2012 12:00:00
tick
01/01/2012 12:00:01
tick
01/01/2012 12:00:02
01/01/2012 12:00:03
01/01/2012 12:00:04
01/01/2012 12:00:05
上面的例子出现了问题。当我们调用了Dispose()方法之后,我们看到虽然OnNext的“tick”停止了,但“OnTimerElapsed”并没有被释放,timer的实例也还没有被disposed,所以仍然在输出ElapsedEventArgs.SignalTime。一个很简单的办法就可以修正这些错误,那就是为IDisposable token返回timer,而不是Disposable.Empty。
Observable.Create有一个重载要求你的Func委托返回一个Action委托,而不是IDisposable。在下面的相似例子中展示了如何使用Action委托来注销事件管理器,并通过保留对计时器的引用来防止内存泄漏:
暂无关于此日志的评论。