Extensões reativas

As Rx (Extensões Reativas) são uma biblioteca para compor programas assíncronos e baseados em eventos usando sequências observáveis e operadores de consulta no estilo LINQ.

As sequências de dados podem assumir várias formas, como um fluxo de dados de um arquivo ou serviço Web, solicitações de serviços Web, notificações do sistema ou uma série de eventos, como entrada do usuário.

Extensões Reativas representa todas essas sequências de dados como sequências observáveis. Um aplicativo pode assinar essas sequências observáveis para receber notificações assíncronas à medida que novos dados chegam. A biblioteca Rx está disponível para desenvolvimento de aplicativos da área de trabalho no .NET. Ele também é lançado para Silverlight, Windows Phone 7 e JavaScript. Para obter mais informações sobre essas diferentes plataformas, consulte o tópico Diferenças entre versões do Rx .

Efetuando pull versus efetuando push de dados

Na programação interativa, o aplicativo sonda ativamente uma fonte de dados para obter mais informações extraindo dados de uma sequência que representa a origem. Esse comportamento é representado pelo padrão iterador de IEnumerable<T>/IEnumerator<T>. A interface T IEnumerable<expõe um único método GetEnumerator() que retorna um IEnumerator<T> para iterar por essa coleção.>  O IEnumerator<T> nos permite obter o item atual (retornando a propriedade Current) e determinar se há mais itens para iterar (chamando o método MoveNext). 

O aplicativo está ativo no processo de recuperação de dados: além de obter um enumerador chamando GetEnumerator, ele também controla o ritmo da recuperação chamando MoveNext por sua própria conveniência. Esse padrão de enumeração é síncrono, o que significa que o aplicativo pode ser bloqueado durante a sondagem da fonte de dados. Esse padrão de pull é semelhante a visitar sua biblioteca e fazer check-out de um livro. Depois de terminar o livro, você faz outra visita para marcar outro.

Por outro lado, na programação reativa, o aplicativo recebe mais informações assinando um fluxo de dados (chamado de sequência observável em Rx) e qualquer atualização é entregue a ele da origem. O aplicativo é passivo no processo de recuperação de dados: além de assinar a fonte observável, ele não sonda ativamente a origem, mas apenas reage aos dados que estão sendo enviados por push para ele. Quando o fluxo não tiver mais dados a serem oferecidos ou quando ele errar, a origem enviará um aviso ao assinante. Dessa forma, o aplicativo não será bloqueado aguardando a origem ser atualizada.

Esse é o padrão de push empregado pelas Extensões Reativas. É semelhante a ingressar em um clube do livro no qual você registra seu interesse em um determinado gênero, e livros que correspondem ao seu interesse são automaticamente enviados para você à medida que são publicados. Você não precisa ficar na fila para adquirir algo que deseja. Empregar um padrão de push é útil em muitos cenários, especialmente em um ambiente pesado de interface do usuário no qual o thread da interface do usuário não pode ser bloqueado enquanto o aplicativo aguarda alguns eventos. Isso também é essencial em ambientes de programação, como o Silverlight, que tem seu próprio conjunto de requisitos assíncronos. Em resumo, usando o Rx, você pode tornar seu aplicativo mais responsivo.

O modelo de push implementado pelo Rx é representado pelo padrão observável de IObservable<T>/IObserver<T>. A interface T IObservable<é uma dupla da interface IEnumerable<T> familiar.> Ele abstrai uma sequência de dados e mantém uma lista de implementações de IObserver<T> que estão interessadas na sequência de dados. O IObservable notificará todos os observadores automaticamente de quaisquer alterações de estado. Para registrar um interesse por meio de uma assinatura, use o método Subscribe de IObservable, que assume um IObserver e retorna um IDisposable. Isso oferece a capacidade de acompanhar e descartar a assinatura. Além disso, a implementação do LINQ do Rx em sequências observáveis permite que os desenvolvedores componham consultas complexas de processamento de eventos em sequências baseadas em push, como eventos .NET, cálculos baseados em APM ("IAsyncResult"), cálculos baseados em Tarefa<T>, APIs de Sensor e Localização do Windows 7, fluxos de eventos temporais do SQL StreamInsight, eventos de primeira classe F# e fluxos de trabalho assíncronos. Para obter mais informações sobre as interfaces T</IObservable T>/IObserver<T> , consulte Explorando as interfaces principais no Rx. Para obter tutoriais sobre como usar os diferentes recursos no Rx, consulte Usando o Rx.