Domanda

Che cos'è LINQ to events a.k.a RX Framework ovvero le estensioni reattive in .NET 4.0 (ma disponibile anche come versione backported)?

In altre parole, a cosa servono tutte le cose in System.Reactive.dll?

È stato utile?

Soluzione

Il team di .NET Rx (questo non è un nome ufficiale) ha scoperto che qualsiasi sequenza push (eventi, callback) può essere vista come una sequenza pull (come facciamo normalmente durante l'accesso agli enumerabili) e & # 8211; o sono di natura doppia. In breve l'osservatore / modello osservabile è il doppio del modello di enumerazione.

Allora, cosa c'è di bello in questa dualità?

Tutto ciò che fai con le sequenze Pull (leggi la codifica in stile dichiarativo) è applicabile anche alle sequenze push. Ecco alcuni aspetti. Puoi creare osservabili da eventi esistenti e quindi utilizzarli come cittadini di prima classe in .NET & # 8211; vale a dire, è possibile creare un osservabile da un evento ed esporre lo stesso di una proprietà.

Poiché IObservable è il doppio matematico di IEnumerable, .NET Rx facilita LINQ su sequenze push come Eventi, proprio come LINQ su IEnumerables

Offre una maggiore libertà di comporre nuovi eventi & # 8211; puoi creare eventi specifici dagli eventi generali.

.NET Rx introduce due interfacce, IObservable e IObserver che "forniscono un'alternativa all'utilizzo di adattatori di input e output come produttore e consumatore di sorgenti di eventi e sink" e questo diventerà presto il de facto per la scrittura di codice asincrono in modo dichiarativo. Ecco un breve esempio.

//Create an observable for MouseLeftButtonDown

var mouseLeftDown=Observable.FromEvent<MouseButtonEventArgs>  
        (mycontrol,"MouseLeftButtonDown");  

//Query the above observable just to select the points
var points = from ev in mouseEvents  
                 select ev.EventArgs.GetPosition(this);  

//Show points in the window's title, when ever user
//presses the left button of the mouse
points.Subscribe(p => this.Title = "Location ="  
                                        + p.X + "," + p.Y);

Puoi anche passare attraverso questi post per avere la testa e la coda in dettaglio. Dai anche un'occhiata al codice sorgente relativo.

Dai un'occhiata a questo set di articoli

Altri suggerimenti

Puoi leggere di più qui: http://themechanicalbride.blogspot.com/2009/07 /introducing-rx-linq-to-events.html

La mia prima esposizione è stata su questo blog, mentre sto leggendo il suo libro su F #: http://tomasp.net/articles/reactive-ii-csevents.aspx

Fondamentalmente la mia comprensione è che quando scrivi un gestore di eventi per i movimenti del mouse, ad esempio, potresti voler catturare continuamente questi eventi e forse essere in grado di contare quanti movimenti o clic, ma, fondamentalmente, vuoi utilizzare tali informazioni in più modi diversi dal solo gestore di eventi. Quindi, tratta gli eventi come un flusso continuo.

Guarda anche questo video di Channel 9: Esperto in esperto: Brian Beckman ed Erik Meijer - All'interno del .NET Reactive Framework (Rx)

Dalla descrizione dello spettacolo:

  

.NET Reactive Framework (Rx) è il doppio matematico di LINQ su   Oggetti. Si compone di una coppia di   interfacce IObserver / IObservable che   rappresenta push-based, o osservabile,   raccolte, oltre a una libreria di   metodi di estensione che implementano il   Operatori di query standard LINQ e   altra trasformazione utile del flusso   funzioni.

Penso che l'essenza della RX sia cambiando l'angolazione con cui guardiamo le informazioni. Naturalmente, ogni informazione è il risultato di un processo che si svolge nel continuum spazio-temporale. L'approccio tradizionale funziona con la proiezione del processo sul piano temporale "corrente" , perdendo di conseguenza i dettagli della dimensione temporale.

RX funziona con la proiezione su un'altra dimensione, catturando anche la componente temporale, quindi non c'è da meravigliarsi che LINQ to RX sia un superset del normale LINQ.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top