2013-05-14 43 views
2

嗨我一直在想一段时间Subject<T>处置所有基于它的订阅,如果你手动调用它的Dispose方法。但是我最近发现它不能这样工作,它只是清除它的内部观察者集合,并用DisposedObserver辅助类实例替换它。为什么主题<T> .Dispose为什么不处理当前订阅?

我发现自己对行为有点困惑,只是假设“正常”只会传播和处理所有的用户。后来,试图找出为什么这样设计,我猜想了他们为什么这样设计的几个原因。

  • 审稿人可能是一个组成部分依赖于主题,所以处置的完全传播没有意义。即。正如大家所期待的那样,合并不仅仅是因为其中一个来源被处置掉了。
  • Subject.Dispose它在语义上等同于从观察者侧面延续Observable.Never。 Subject.Dispose调用者也可以调用OnComplete或OnError,如果想要在处理前发出错误或完成信号(因为它们在相同范围内)。

编辑提示: 对不清楚的问题。我已经了解如何使用它,这更像是一个设计问题。让我更清楚地陈述它。

为什么您认为Rx的设计者使Dispose行为如此呢?

(以上两点是我的回答试行)

+0

你应该添加你的答案作为答案,而不是把它们放在问题中。 – 2013-05-14 17:08:49

+1

更有趣的问题(至少对我来说)是为什么他们甚至提出了“IDisposable”主题。 – Brandon 2013-05-14 21:03:12

+0

这是一个很好的问题 - 据我所知,Rx本身并没有使用它。 – 2013-05-14 22:07:58

回答

5

主题应表明它是通过发送的onComplete或可能的OnError完成。这是惯用和语法上正确的Rx。订阅者负责通过处置订阅来结束订阅。您应该编写Observables,这样即使用户没有退订,他们也会在“完成”后清理资源。

相关问题