Estensioni reattive

Le estensioni reattive (Rx) sono una libreria per la composizione di programmi asincroni e basati su eventi usando sequenze osservabili e operatori di query in stile LINQ.

Le sequenze di dati possono assumere molte forme, ad esempio un flusso di dati da un file o da un servizio Web, richieste di servizi Web, notifiche di sistema o una serie di eventi, ad esempio l'input dell'utente.

Le estensioni reattive rappresentano tutte queste sequenze di dati come sequenze osservabili. Un'applicazione può sottoscrivere queste sequenze osservabili per ricevere notifiche asincrone man mano che arrivano nuovi dati. La libreria Rx è disponibile per lo sviluppo di applicazioni desktop in .NET. Viene rilasciato anche per Silverlight, Windows Phone 7 e JavaScript. Per altre informazioni su queste piattaforme diverse, vedere l'argomento Differenze tra le versioni di Rx .

Pull e push di dati

Nella programmazione interattiva, l'applicazione esegue attivamente il polling di un'origine dati per altre informazioni eseguendo il pull dei dati da una sequenza che rappresenta l'origine. Questo comportamento è rappresentato dal modello iteratore di IEnumerable<T>/IEnumerator<T>. L'interfaccia IEnumerable<T> espone un singolo metodo GetEnumerator() che restituisce un IEnumerator<T> per scorrere questa raccolta.  IEnumerator<T> consente di ottenere l'elemento corrente (restituendo la proprietà Current) e di determinare se sono presenti più elementi da scorrere (chiamando il metodo MoveNext). 

L'applicazione è attiva nel processo di recupero dei dati: oltre a ottenere un enumeratore chiamando GetEnumerator, controlla anche il ritmo del recupero chiamando MoveNext a proprio piacimento. Questo modello di enumerazione è sincrono, il che significa che l'applicazione potrebbe essere bloccata durante il polling dell'origine dati. Questo modello di pull è simile alla visita alla tua biblioteca e al check-out di un libro. Dopo aver finito con il libro, si paga un'altra visita per controllare un altro.

D'altra parte, nella programmazione reattiva, l'applicazione offre altre informazioni sottoscrivendo un flusso di dati (chiamato sequenza osservabile in Rx) e qualsiasi aggiornamento viene consegnato all'applicazione dall'origine. L'applicazione è passiva nel processo di recupero dei dati, a parte la sottoscrizione all'origine osservabile, non esegue attivamente il polling dell'origine, ma reagisce semplicemente ai dati di cui viene eseguito il push. Quando il flusso non contiene più dati da offrire o quando si verifica un errore, l'origine invierà un avviso al sottoscrittore. In questo modo, l'applicazione non verrà bloccata in attesa dell'aggiornamento dell'origine.

Questo è il modello di push usato dalle estensioni reattive. È simile all'adesione a un club di libri in cui registri il tuo interesse in un particolare genere, e i libri che corrispondono al tuo interesse vengono inviati automaticamente a te mentre vengono pubblicati. Non è necessario restare in linea per acquisire qualcosa che si desidera. L'uso di un modello di push è utile in molti scenari, in particolare in un ambiente a elevato utilizzo dell'interfaccia utente in cui il thread dell'interfaccia utente non può essere bloccato mentre l'applicazione è in attesa di alcuni eventi. Ciò è essenziale anche negli ambienti di programmazione, ad esempio Silverlight, che ha un proprio set di requisiti asincroni. In sintesi, usando Rx, è possibile rendere l'applicazione più reattiva.

Il modello push implementato da Rx è rappresentato dal modello osservabile di T/IObservable<T>/IObserver<T>. L'interfaccia IObservable<T> è una doppia interfaccia IEnumerable<T> familiare. Astrae una sequenza di dati e mantiene un elenco di implementazioni T> di IObserver<interessate alla sequenza di dati. IObservable informerà automaticamente tutti gli osservatori di eventuali modifiche di stato. Per registrare un interesse tramite una sottoscrizione, usare il metodo Subscribe di IObservable, che accetta un IObserver e restituisce un IDisposable. In questo modo è possibile tenere traccia della sottoscrizione ed eliminarla. Inoltre, l'implementazione LINQ di Rx su sequenze osservabili consente agli sviluppatori di comporre query di elaborazione di eventi complessi su sequenze basate su push, ad esempio eventi .NET, calcoli basati su APM ("IAsyncResult"), calcoli basati su T<> attività, API sensore e posizione di Windows 7, flussi di eventi temporali di SQL StreamInsight, eventi F# di prima classe e flussi di lavoro asincroni. Per altre informazioni sulle interfacce T/IObservable<T>>/IObserver<, vedere Esplorazione delle interfacce principali in Rx. Per esercitazioni sull'uso delle diverse funzionalità in Rx, vedere Uso di Rx.