c# - 为什么 Subject<T>.Dispose 不处理当前订阅?

标签 c# system.reactive reactive-programming

嗨,我想了一段时间 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/

相关文章:

c# - 事件触发事件

javascript - Rx debounce operator with first 和 last

scala - scala 在处理文件时是否提供异步非阻塞 IO?

android - 在 Android 上的 RxJava2 中结合 Singles 的最佳方式?

c# - 如何从 C# 中的剪贴板历史记录中获取所有数据的列表?

c# - 在NET核心中以有效的方式将一种数据类型的数组转换为另一种数据类型的数组?

c# - 如何使用 PDFsharp 将动态生成的位图插入到 PDF 文档中?

c# - 当 C# Reactive Framework 中源流和目标流相同时,SelectMany 如何工作?

c# - 如果没有 GetAwaiter 方法,我可以 await 吗?

javascript - RxJS + Node.js Http 请求