【问题标题】:IObserver -- what should the observer do when IObserver.OnError is calledIObserver -- 调用 IObserver.OnError 时观察者应该做什么
【发布时间】:2013-01-02 20:28:54
【问题描述】:

我在我的一个项目中使用IObserver/IObservable 接口。

CommandReader 是一个 IObservable,它不断地从流中读取数据,然后将其传递给它的 CommandHandler IObserver(s)。

当底层流关闭时(例如连接断开),我将使用IObserver.OnError(exception) 方法通知观察者

观察者收到此通知后应该做什么?它应该从 observable 中释放自己吗?还是那是父类的责任?

【问题讨论】:

    标签: c# system.reactive observer-pattern


    【解决方案1】:

    对于初学者,您通常不应实现自己的 IObservableIObserver 对象。你的问题暗示了为什么。让底层行为正确是非常困难的。

    现在每次调用IObservable.Subscribe 都会返回一个IDisposable。如果Subscribe 的调用者希望在调用OnCompletedOnError 之前取消订阅可观察对象,则使用此选项。但是,如果调用了OnCompletedOnError,那么IDisposable 会被自动处理掉。因此,当一个可观察的集合完成时,Rx 会自动自动清理。

    每个单独的观察者不需要管理自己的订阅生命周期。观察者只需回复OnCompleted/OnError消息即可。

    在您的代码中,我建议您考虑稍微更改您的代码。我希望带有Subscribe 方法的CommandReaderPublisher 类可能比CommandReader 类更合适。一旦 Rx 流完成,它就不能继续使用。

    我还想知道当底层流关闭时调用OnCompleted 是否会比OnError(exception) 更好。如果发生错误,那很好,但如果它关闭,那么ONCompleted 可能会更好。

    【讨论】:

    • +1 不要实现 IObserver/IObservable 接口。使用 Rx 库。 Observable.Create/Generate/etc 是您创建可观察序列的方式,订阅扩展方法是您使用可观察序列的方式。 www.IntroToRx.com。
    【解决方案2】:

    我建议 IObservable 的工作是从它自己的订阅列表中删除观察者。同样,如果 IObserver 有一个 IObservable 列表,那么 IObserver 应该管理该列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多