2013-01-19 12 views
5

Sto utilizzando le interfacce IObserver/IObservable in un mio progetto.IObserver: cosa deve fare l'osservatore quando IObserver.OnError viene chiamato

Il CommandReader è un IObservable che legge continuamente i dati da un flusso e poi lo passa al suo CommandHandlerIObserver (s).

Quando il flusso sottostante è chiuso (ad esempio connessione muore) allora io notificare agli osservatori l'IObserver.OnError(exception) metodo

cosa dovrebbe dell'osservatore fare quando riceve la notifica? Dovrebbe liberarsi dall'osservabile? O è la responsabilità della classe genitrice?

risposta

3

Per i principianti in genere non è necessario implementare gli oggetti IObservable e IObserver. La tua domanda è di suggerimenti sul perché. È molto difficile ottenere il comportamento sottostante corretto.

Ora ogni chiamata a IObservable.Subscribe restituisce un IDisposable. Viene utilizzato se il chiamante di Subscribe desidera annullare l'iscrizione a un osservabile prima che venga chiamato uno OnCompleted o OnError. Tuttavia, se viene chiamato uno OnCompleted o OnError, lo IDisposable viene automaticamente eliminato. Così efficacemente Rx si ripulisce automaticamente da solo quando una collezione osservabile completa.

Ogni singolo osservatore non ha bisogno di gestire la propria durata di abbonamento. L'osservatore deve solo rispondere al messaggio OnCompleted/OnError.

Nel codice suggerisco di modificare leggermente il codice. Mi aspetto che una classe CommandReaderPublisher con un metodo Subscribe sia più appropriata di una classe CommandReader. Una volta completato un flusso Rx, non può continuare a essere utilizzato.

Inoltre mi chiedo se chiamare OnCompleted sarebbe meglio di OnError(exception) quando lo streaming sottostante si chiude. Se si verifica un errore, allora va bene, ma se si chiude allora ONCompleted potrebbe essere migliore.

+0

+1 Non implementare le interfacce IObserver/IObservable. Usa la libreria Rx. Observable.Create/Genera/etc è il modo in cui crei una sequenza osservabile e i metodi di estensione Iscriviti sono il modo in cui il consumatore osserva una sequenza osservabile. www.IntroToRx.com. –

0

Suggerirei che è compito dell'IObserver rimuovere gli osservatori dal proprio elenco di sottoscrizioni. Allo stesso modo, se un IObserver ha un elenco di IObservable, l'IObserver dovrebbe gestire quell'elenco.

Problemi correlati