为什么Subject <t> .Dispose不会处理当前订阅?</t>

时间:2013-05-14 10:31:14

标签: c# system.reactive reactive-programming

您好我一直在考虑Subject<T>如果您手动调用Dispose方法,Subject.Dispose会根据它处理所有订阅。但是我最近发现它不起作用,只是清除它的内部观察者集合并用DisposedObserver帮助器类实例替换它。

我发现自己对行为有点困惑,只是假设“正常”只会传播并处置所有的嫌疑人。后来,试图弄清楚为什么这样设计,我猜想他们为什么这样设计的原因。

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

编辑注意: 对不起的问题很抱歉。我已经明白了如何使用它,这更像是一个设计问题。让我更清楚地说明一下。

为什么你认为Rx的设计者以这种方式制作Dispose行为?

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

1 个答案:

答案 0 :(得分:6)

主题应通过发送OnComplete或可能的OnError来指示它已完成。这是惯用的和语法正确的Rx。订阅者有责任通过处置它们来结束订阅。您应该编写Observables,以便他们在“完成”后清理资源,即使订阅者没有取消订阅。