嗨,我想了一段时间 Subject<T>
如果您手动调用它的 Dispose
,则基于它处理所有订阅方法。但我最近发现它不是那样工作的,它只是清除其内部的观察者集合并用 DisposedObserver 辅助类实例替换它。
我发现自己对这种行为有点困惑,只是假设“正常”只是传播和处置所有订阅者。后来想弄清楚为什么要这样设计,我猜到了他们这样设计的几个原因。
- 订阅者可能是部分依赖主题的组合,因此完全传播处置没有意义。 IE。正如每个人所期望的那样,Merge 并没有因为其中一个来源被处置而被处置。
-
Subject.Dispose
它在语义上等同于Observable.Never
的延续从观察者的一侧。 Subject.Dispose 调用者也可以调用 OnComplete 或 OnError 如果想在处理前发出错误或完成信号(因为它们在同一范围内)。
编辑说明: 对不起,不清楚的问题。我已经了解如何使用它,这更像是一个设计问题。让我说得更清楚些。
为什么你认为 Rx 的设计者会那样做 Dispose 行为?
(以上两点是我的试答)
最佳答案
主题应该通过发送 OnComplete 或可能的 OnError 来表明它已完成。这在惯用语和语法上都是正确的 Rx。订户有责任通过处置来结束他们的订阅。您应该编写 Observables,以便它们在“完成”后清理资源,即使订阅者没有取消订阅也是如此。
关于c# - 为什么 Subject<T>.Dispose 不处理当前订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16540853/