我在我的项目中使用IObserver
/ IObservable
接口。
CommandReader
是IObservable
,它会不断从流中读取数据,然后将其传递给CommandHandler
IObserver
。
当基础流关闭时(例如连接死亡),我将使用IObserver.OnError(exception)
方法通知观察者
观察员收到此通知后应该怎么做?它应该从观察中释放出来吗?或者是父类的责任?
答案 0 :(得分:3)
对于初学者,通常不应该实现自己的IObservable
和IObserver
对象。你的问题有点暗示为什么。很难让基本行为正确。
现在,对IObservable.Subscribe
的每次通话都会返回IDisposable
。如果Subscribe
的来电者希望在调用OnCompleted
或OnError
之前取消订阅可观察对象,则会使用此功能。但是,如果调用OnCompleted
或OnError
,则会自动处理IDisposable
。因此,当可观察的集合完成时,Rx会自动清理它。
每个观察者都不需要管理自己的订阅生命周期。观察者只需要回复OnCompleted
/ OnError
消息。
在您的代码中,我建议您考虑稍微更改代码。我希望使用CommandReaderPublisher
方法的Subscribe
类可能比CommandReader
类更合适。一旦Rx流完成,就无法继续使用它。
此外,我想知道当基础流关闭时,调用OnCompleted
是否会优于OnError(exception)
。如果发生错误则没关系,但如果关闭则ONCompleted
可能更好。
答案 1 :(得分:0)
我建议IObservable的工作是从它自己的订阅列表中删除观察者。同样,如果IObserver有一个IObservable列表,那么IObserver应该管理该列表。