嗨,我一直在想,如果您手动调用其Dispose
方法,Subject<T>
将基于它处置所有订阅。但是我最近发现它不是这样工作的,它只是清除它的内部观察者集合,并用一个DisposedObserver helper类实例代替它。
我发现自己对这种行为有点困惑,只是假设"正常"将只是传播并处理所有订阅者。后来,我试图弄清楚为什么这样设计,我猜出了他们这样设计的几个原因。
- 订阅者可能是一个部分依赖于主题的组合,因此完全传播处置是没有意义的。ie。合并不会像每个人期望的那样,仅仅因为其中一个源被处理就被处理。
-
Subject.Dispose
从观察者的角度,语义上等同于与Observable.Never
的延续。这个话题。处置调用者也可以调用OnComplete或OnError,如果想在处置之前发出错误或完成的信号(因为它们在相同的作用域上)。
编辑注:抱歉我的问题不清楚。我已经知道如何使用它,这更多的是一个设计问题。让我说得更清楚些。
你认为为什么Rx的设计者会这样做?
(以上两点是我的试答)
主题应该通过发送OnComplete或可能的OnError来指示它是完成的。这是习惯上和语法上正确的Rx。订阅者负责通过处置订阅来结束订阅。你应该这样写Observables:一旦资源"完成",即使订阅者没有取消订阅,它们也会清理资源。