IObserver - 调用IObserver.OnError时观察者应该做什么

时间:2013-01-19 02:41:46

标签: c# system.reactive observer-pattern

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

CommandReaderIObservable,它会不断从流中读取数据,然后将其传递给CommandHandler IObserver

当基础流关闭时(例如连接死亡),我将使用IObserver.OnError(exception)方法通知观察者

观察员收到此通知后应该怎么做?它应该从观察中释放出来吗?或者是父类的责任?

2 个答案:

答案 0 :(得分:3)

对于初学者,通常不应该实现自己的IObservableIObserver对象。你的问题有点暗示为什么。很难让基本行为正确。

现在,对IObservable.Subscribe的每次通话都会返回IDisposable。如果Subscribe的来电者希望在调用OnCompletedOnError之前取消订阅可观察对象,则会使用此功能。但是,如果调用OnCompletedOnError,则会自动处理IDisposable。因此,当可观察的集合完成时,Rx会自动清理它。

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

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

此外,我想知道当基础流关闭时,调用OnCompleted是否会优于OnError(exception)。如果发生错误则没关系,但如果关闭则ONCompleted可能更好。

答案 1 :(得分:0)

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