观察者应该怎么做,当观察者.OnError被调用
本文关键字:观察者 OnError 调用 | 更新日期: 2023-09-27 17:54:50
我在我的一个项目中使用IObserver
/IObservable
接口。
CommandReader
是一个连续地从流中读取数据的IObservable
,然后将其传递给它的CommandHandler
IObserver
(s)。
当底层流关闭(例如连接死亡)时,我会用IObserver.OnError(exception)
方法通知观察者
观察者在收到这个通知后应该怎么做?它应该把自己从可观察对象中释放出来吗?还是父类的责任?
对于初学者来说,通常不应该实现自己的IObservable
和IObserver
对象。你的问题暗示了为什么。要使底层行为正确是非常困难的。
现在每次调用IObservable.Subscribe
都会返回一个IDisposable
。如果Subscribe
的调用者希望在OnCompleted
或OnError
被调用之前取消订阅可观察对象,则使用此方法。但是,如果调用了OnCompleted
或OnError
,则会自动清除IDisposable
。所以当一个可观察对象收集完成后,Rx会自动清理它自己。
每个观察者不需要管理自己的订阅生命周期。观察者只需要响应OnCompleted
/OnError
消息。
Subscribe
方法的CommandReaderPublisher
类可能比CommandReader
类更合适。一旦Rx流完成,它就不能继续使用了。
我也想知道当底层流关闭时,调用OnCompleted
是否会比OnError(exception)
更好。如果发生错误,那很好,但如果它关闭,那么ONCompleted
可能更好。
我建议IObservable的工作是从它自己的订阅列表中删除观察者。同样,如果IObserver有一个IObservables列表,那么IObserver应该管理这个列表。