我在我的一个项目中使用IObserver
/IObservable
接口。
这CommandReader
是一个IObservable
连续从流中读取数据,然后将其传递给它的CommandHandler
IObserver
(s)。
当底层流关闭(例如连接终止)时,我将使用该IObserver.OnError(exception)
方法通知观察者
观察者收到这个通知后应该怎么做?它应该从 observable 中释放自己吗?还是那是父类的责任?
我在我的一个项目中使用IObserver
/IObservable
接口。
这CommandReader
是一个IObservable
连续从流中读取数据,然后将其传递给它的CommandHandler
IObserver
(s)。
当底层流关闭(例如连接终止)时,我将使用该IObserver.OnError(exception)
方法通知观察者
观察者收到这个通知后应该怎么做?它应该从 observable 中释放自己吗?还是那是父类的责任?
对于初学者,您通常不应该实现自己的对象IObservable
和IObserver
对象。你的问题暗示了为什么。使基本行为正确是非常困难的。
现在每次调用都IObservable.Subscribe
返回一个IDisposable
. 如果调用者Subscribe
希望在调用OnCompleted
or之前取消订阅 observable,则使用此选项OnError
。但是,如果一个OnCompleted
orOnError
被调用,那么它IDisposable
会被自动处理掉。因此,当一个可观察的集合完成时,Rx 会自动清理自己。
每个单独的观察者不需要管理自己的订阅生命周期。观察者只需要响应OnCompleted
/OnError
消息。
在您的代码中,我建议您考虑稍微更改代码。我希望一个CommandReaderPublisher
有Subscribe
方法的类可能比一个CommandReader
类更合适。一旦 Rx 流完成,它就不能继续使用。
另外我想知道调用OnCompleted
是否会比OnError(exception)
底层流关闭时更好。如果发生错误,那很好,但如果它关闭,那么ONCompleted
可能会更好。
我建议 IObservable 的工作是从它自己的订阅列表中删除观察者。同样,如果 IObserver 有一个 IObservable 列表,那么 IObserver 应该管理该列表。