观察者应该怎么做,当观察者.OnError被调用

本文关键字:观察者 OnError 调用 | 更新日期: 2023-09-27 17:54:50

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

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

当底层流关闭(例如连接死亡)时,我会用IObserver.OnError(exception)方法通知观察者

观察者在收到这个通知后应该怎么做?它应该把自己从可观察对象中释放出来吗?还是父类的责任?

观察者应该怎么做,当观察者.OnError被调用

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

现在每次调用IObservable.Subscribe都会返回一个IDisposable。如果Subscribe的调用者希望在OnCompletedOnError被调用之前取消订阅可观察对象,则使用此方法。但是,如果调用了OnCompletedOnError,则会自动清除IDisposable。所以当一个可观察对象收集完成后,Rx会自动清理它自己。

每个观察者不需要管理自己的订阅生命周期。观察者只需要响应OnCompleted/OnError消息。

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

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

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