5

私のプロジェクトではIObserver/IObservableインターフェイスを使用しています。

CommandReaderIObservableストリームからデータを継続的に読み取り、それをそのストリームに渡すものCommandHandler IObserverです。

IObserver.OnError(exception)基になるストリームが閉じられたとき(たとえば、接続が切断されたとき)、メソッドでオブザーバーに通知します

この通知を受け取ったとき、オブザーバーは何をすべきですか?オブザーバブルから解放する必要がありますか?それとも、それは親クラスの責任ですか?

4

2 に答える 2

3

初心者の場合、通常、独自のオブジェクトを実装するべきではありませIObservableIObserver。あなたの質問は、その理由を示唆しています。根本的な動作を正しくすることは非常に困難です。

これで、を呼び出すたびに。がIObservable.Subscribe返されますIDisposable。これは、またはが呼び出されるSubscribe前に、の呼び出し元がオブザーバブルのサブスクライブを解除したい場合に使用されます。ただし、または が呼び出された場合、は自動的に破棄されます。したがって、効果的にRxは、監視可能なコレクションが完了すると、自動的にクリーンアップします。OnCompletedOnErrorOnCompletedOnErrorIDisposable

個々のオブザーバーは、それ自体のサブスクリプションの有効期間を管理する必要はありません。オブザーバーはOnCompleted/OnErrorメッセージに応答するだけで済みます。

あなたのコードでは、コードを少し変更することを検討することをお勧めします。CommandReaderPublisherメソッドを持つクラスの方がクラスSubscribeよりも適切かもしれないと思いCommandReaderます。Rxストリームが完了すると、それを継続して使用することはできません。

また、基になるストリームが閉じるときよりも呼び出しのOnCompleted方が良いのではないかと思います。OnError(exception)エラーが発生した場合は問題ありませんが、エラーが発生した場合は問題がONCompletedない可能性があります。

于 2013-01-19T05:30:59.170 に答える
0

自分のサブスクリプションリストからオブザーバーを削除するのはIObservableの仕事だと思います。同様に、IObserverにIObservableのリストがある場合、IObserverはそのリストを管理する必要があります。

于 2013-01-19T04:37:24.897 に答える