2013-04-08 12 views
5

Tentativo di comprendere why and when I would need per utilizzare Reactive Extension (Rx) per .NET, sono giunto alla domanda "C# 5.0 async/await feature and Rx - Reactive Extensions" la cui lettura con i suoi riferimenti ha generato più domande che risposte.Perché non è possibile utilizzare IObservable <T> senza l'estensione Reactive (Rx) per .NET?

Il riferimento in quest'ultimo articolo Task vs IObservable: when to use what? sembra riferirsi all'uso di IObservable come sinonimi (o in modo intercambiabile) per l'utilizzo di Reactive (Rx) extensions for .NET

Che cosa significa, per esempio, la frase del citato articolo:

Il tuo codice richiederà le estensioni reattive se hai scelto di restituire IObservable

voleva dire?

Entrambe Task<T> e IObservable<T> sono parte di .NET che sto utilizzando senza alcun riferimento o configurazione di Rx.
Perché sono necessarie estensioni reattive per ripristinare IObservable?

Cosa deve fare RX nella discussione di Task<T> rispetto a IObassable?
E perché il loro utilizzo viene giustapposto?

risposta

13

In realtà è dovuto alla facilità di implementazione. Non si dovrebbe mai tentare di implementare IObservable<T> da soli; Rx ha tutte le implementazioni che potresti aver bisogno di fare in modo corretto ed efficiente.

Il Rx design guidelines specifica la semantica effettiva di IObservable<T>. Si noti che lo MSDN example implementation è completamente e completamente sbagliato.

Aggiornamento:

Il codice di esempio MSDN fallisce la seguente semantica (i numeri di riferimento sono le linee guida di progettazione dal documento di cui sopra):

  • non impone la grammatica Rx (4.1).
  • Non si annulla automaticamente l'iscrizione dopo OnError (4.3).
  • Potrebbe non gestire correttamente i casi d'angolo (6.1, 6.2).
  • OnError non ha interruzioni di semantica (6.6).
  • Se una sottoscrizione viene eliminata e lo stesso osservatore viene nuovamente sottoscritto, l'abbonamento originale non è più idempotente (6.17).

E questo è solo se l'implementazione personalizzata presuppone che tutte le chiamate a TrackLocation siano serializzate. Nel mondo Rx, questo non è quasi mai il caso.

Si noti che è possibile risolvere tutti questi problemi con l'operatore Rx Synchronize, anche se si deve ancora fare l'ipotesi sulle chiamate serializzate su TrackLocation.

+2

Alcune parole sul perché l'implementazione MSDN è "completamente e completamente sbagliato" sarebbe bello :) – Eyvind

+0

Tecnicamente, l'implementazione è "completamente e completamente" non aggiornata. :) È stato scritto circa Rx 1.0. Siamo in procinto di spostare (e aggiornare) tutta la documentazione su rx.codeplex.com (dove è anche possibile trovare l'intera base di codice Rx open-source). Stephen, grazie per aver segnalato i problemi specifici! –

+0

@lindydonna, grazie per il vostro feedback. Sono riuscito a utilizzare Reactive Extensions (Rx) [v1.0.2856.104] (http://www.microsoft.com/en-us/download/details.aspx?id=24940) + [SP1] (http: // www.microsoft.com/en-us/download/details.aspx?id=28568) ma in mancanza di [v.2.0] (http://www.microsoft.com/en-us/download/details.aspx? id = 30708) + inclusi [quelli da codeplex] (https://rx.codeplex.com/SourceControl/list/changesets) su VS2010/.NET4.0 (Windows XP SP3). Hai un'esperienza diversa? –

1

IObservable e IObserver sono stati creati dal team Rx per Rx ... lo hanno inserito nel.NET Framework in modo che le persone possano programmare contro quell'interfaccia ed esporre IObservable nelle loro librerie senza costringere tutti a richiedere automaticamente tutti gli assembly Rx, ma non appena si vuole effettivamente fare qualcosa con IObservable, si dovrà creare classi Rx-like consumarli o utilizzare Rx.

IObserver e IObserver sono matematicamente doppi (le "frecce", la direzione di flusso dei parametri e dei valori di ritorno, è invertita in modo intelligente) a IEnumerable e IEnumerator. Simile a come non è possibile fare molto con IEnumerable oltre a MoveNext e Current e utilizzare un'istruzione foreach che avvolge quei metodi (metodo e proprietà, in realtà), ma LINQ fornisce tutti i tipi di metodi di estensione che funzionano su IE, Rx fornisce metodi di estensioni per IO. Sarebbe possibile avere Subscribe implementato nel BCL, e solo quello, e magari aggiungere una dichiarazione simile a foreach che lo fa per te, ma poi troverai rapidamente che hai bisogno dell'utilità di altre cose per massimizzare davvero l'uso di IO.

Problemi correlati