5

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

CommandReader是一个IObservable连续从流中读取数据,然后将其传递给它的CommandHandler IObserver(s)。

当底层流关闭(例如连接终止)时,我将使用该IObserver.OnError(exception)方法通知观察者

观察者收到这个通知后应该怎么做?它应该从 observable 中释放自己吗?还是那是父类的责任?

4

2 回答 2

3

对于初学者,您通常不应该实现自己的对象IObservableIObserver对象。你的问题暗示了为什么。使基本行为正确是非常困难的。

现在每次调用都IObservable.Subscribe返回一个IDisposable. 如果调用者Subscribe希望在调用OnCompletedor之前取消订阅 observable,则使用此选项OnError。但是,如果一个OnCompletedorOnError 被调用,那么它IDisposable会被自动处理掉。因此,当一个可观察的集合完成时,Rx 会自动清理自己。

每个单独的观察者不需要管理自己的订阅生命周期。观察者只需要响应OnCompleted/OnError消息。

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

另外我想知道调用OnCompleted是否会比OnError(exception)底层流关闭时更好。如果发生错误,那很好,但如果它关闭,那么ONCompleted可能会更好。

于 2013-01-19T05:30:59.170 回答
0

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

于 2013-01-19T04:37:24.897 回答