2013-01-19 7 views
5

genannt wird Ich verwende die IObserver/IObservable Schnittstellen in einem Projekt von mir.IObserver - was sollte der Beobachter tun, wenn IObserver.OnError

The CommandReader ist ein IObservable das kontinuierlich Daten aus einem Strom liest und übergibt es dann in seine CommandHandlerIObserver (s).

Wenn der zugrunde liegende Stream geschlossen ist (beispielsweise Verbindung stirbt), dann werde ich die Beobachter mitteilen, mit der IObserver.OnError(exception) Methode

Was sollte der Beobachter tun, wenn es diese Benachrichtigung erhält? Sollte es sich vom Observablen lösen? Oder ist das die Verantwortung der Elternklasse?

Antwort

3

Für den Anfang sollten Sie in der Regel keine eigenen Objekte IObservable und IObserver implementieren. Deine Frage gibt Hinweise darauf, warum. Es ist sehr schwierig, das zugrunde liegende Verhalten zu korrigieren.

Nun gibt jeder Aufruf an IObservable.Subscribe einen IDisposable zurück. Dies wird verwendet, wenn der Anrufer von Subscribe sich von einer Observablen abmelden möchte, bevor eine OnCompleted oder OnError aufgerufen wird. Wenn jedoch eine OnCompleted oder OnError aufgerufen wird, wird die IDisposable automatisch entsorgt. Effektiv räumt Rx automatisch auf, wenn eine beobachtbare Sammlung abgeschlossen ist.

Jeder einzelne Beobachter muss seine eigene Abonnementlebensdauer nicht verwalten. Der Beobachter muss nur auf die Nachricht OnCompleted/OnError antworten.

In Ihrem Code würde ich vorschlagen, dass Sie darüber nachdenken, Ihren Code leicht zu ändern. Ich würde erwarten, dass eine CommandReaderPublisher Klasse mit einer Subscribe Methode geeigneter wäre als eine CommandReader Klasse. Sobald ein Rx-Stream abgeschlossen ist, kann er nicht mehr verwendet werden.

Auch ich frage mich, ob Anruf OnCompleted wäre besser als OnError(exception), wenn der zugrunde liegende Stream schließt. Wenn ein Fehler auftritt, ist das in Ordnung, aber wenn es geschlossen wird, dann könnte ONCompleted besser sein.

+0

+1 Implementieren Sie die IObserver/IObservable-Schnittstellen nicht. Verwenden Sie die Rx-Bibliothek. Observable.Create/Generate/etc ist, wie Sie eine Observable-Sequenz erstellen und die Subscriber-Erweiterungsmethode ist, wie Sie eine beobachtbare Sequenz konsumieren. www.IntroToRx.com. –

0

Ich würde vorschlagen, dass es die Aufgabe des IObservable ist, Beobachter aus der eigenen Subskriptionsliste zu entfernen. Ebenso, wenn ein IObserver eine Liste von IObservables hat, sollte der IObserver diese Liste verwalten.

Verwandte Themen