我在我的一个项目中使用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希望在调用OnCompletedor之前取消订阅 observable,则使用此选项OnError。但是,如果一个OnCompletedorOnError 被调用,那么它IDisposable会被自动处理掉。因此,当一个可观察的集合完成时,Rx 会自动清理自己。
每个单独的观察者不需要管理自己的订阅生命周期。观察者只需要响应OnCompleted/OnError消息。
在您的代码中,我建议您考虑稍微更改代码。我希望一个CommandReaderPublisher有Subscribe方法的类可能比一个CommandReader类更合适。一旦 Rx 流完成,它就不能继续使用。
另外我想知道调用OnCompleted是否会比OnError(exception)底层流关闭时更好。如果发生错误,那很好,但如果它关闭,那么ONCompleted可能会更好。
我建议 IObservable 的工作是从它自己的订阅列表中删除观察者。同样,如果 IObserver 有一个 IObservable 列表,那么 IObserver 应该管理该列表。