Unsubscribing
RX使用返回IDisposable对象的方式来代替取消订阅的方法。它可以被看作是subscription(订阅物)自身,或者代表subscription(订阅物)的token。它能释放subscription(订阅物)并有效的取消订阅。释放Subscribe的结果不会对其他订阅者造成任何副作用,只是从可观测物内部发订阅list中移除subscription (订阅物)而已。
这将允许我们对同一个可观测物调用多次Subscribe方法,并允许订阅之间不互相影响。在下面的例子中,Subject<int>()类型的values有两个subscription (订阅物),然后我们释放了较早的subscription (订阅物),但其他的仍然可以继续接收消息:
在第一个订阅物被注销后,1st subscription就不再被打印出来:
使用IDisposable有以下好处:
- 类型已经存在
- 类型为人所熟悉
IDisposable有标准模式和使用场景
- 支持using语句
- 在这个使用场景中,可以使用例如FxCop这样的静态分析工具进行辅助
- IObservable<T>处理残余非常简单
只要遵照IDisposable的指引,Dispose方法就可以被调用多次,第一次调用将取消subscription (订阅物),而之后的调用将因为subscription (订阅物)已经被取消而不做任何操作(而不会引发异常)。
OnError and OnCompleted
OnError和OnCompleted都表示sequence(队列)的结束。如果你的sequence(队列)调用了OnError或者OnCompleted,它们将会是最后一次发布,并且之后再调用OnNext的话将不被执行:
当然,你可以定义你的IObservable<T>,使其在调用了OnError或者OnCompleted之后仍然可以发布,但它将不会遵守当前Subject的优先级,也不是一个标准的实现。不一致的行为将导致程序的不确定性。
当调用了OnError或者OnCompleted之后,仍然应当dispose订阅。
IDisposable
IDisposable接口非常方便,对RX也不可或缺。可以把实现了IDisposable接口的对象理解为有明确的生命周期管理的对象。可以通过调用Dispose()方法来结束它的生命周期。
运用和using语句可以方便的创建一个作用域,该作用域类似try/finally,在离开作用域后自动调用Dispose方法。
如果我们可以用IDisposable接口创建一个有效的作用域,就可以创建一些小class来做一些有趣的事情,例如下面的这个简单的记录时间事件的类的例子:
这个方便的小类可以配合using语句创建一个作用域并测量代码库的某些部分的运行时间,使用方式如下:
还可以用该概念来设置控制台文字输出颜色:
使用方式如下:
RX中的这些类型也实现了IDisposable接口:
- Disposable
- BooleanDisposable
- CancellationDisposable
- CompositeDisposable
- ContextDisposable
- MultipleAssignmentDisposable
- RefCountDisposable
- ScheduledDisposable
- SerialDisposable
- SingleAssignmentDisposable
附录中介绍了它们的信息可供参考。接下来我们看看非常简单并且有用的Disposable 静态类:
正如所见,这个类暴露了两个成员:Empty和Create。
Empty用于在被要求返回一个IDisposable实例时,返回一个在Dispose时不做任何处理的实例。
Create允许你传递一个Action给其创建的实例,使其在被disposed时被调用。
Create方法遵守Dispose标准,所以即使多次调用Dispose()方法,委托也只会被执行一次:
注意"Being disposed." 只打印了一次,原因之前已经提到,“所以即使多次调用Dispose()方法,委托也只会被执行一次”。后面我们将介绍一种将资源的生命周期和Observable.Using语句作用域进行绑定的方法。
暂无关于此日志的评论。