BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias O futuro do C#: Sequências assíncronas

O futuro do C#: Sequências assíncronas

Favoritos

A sintaxe async/await foi bem recebida no C#, mas agora os desenvolvedores estão solicitando mais recursos. Especificamente, eles querem poder retornar mais de um valor de suas funções assíncronas usando uma sintaxe do tipo "yield return". Esta capacidade vêm sendo descrita como "sequências assíncronas" em uma nova proposta para o C# 7.

Os proponentes da proposta gostariam de contar com dois padrões:

  • IObservable<T>, que consiste nos fundamentos da Reactive Extensions (Rx) e é parte do .NET 4.0;
  • IAsyncEnumerable<T>, que foi introduzido com o projeto Interactive Extensions (Ix) e é utilizado no Entity Framework 7.

Definindo o produtor

Segundo HaloFour:

Do ponto de vista de produção da sequência, ela deve se comportar ligeiramente diferente na forma de yield return para IObservable<T>, que deve continuar executando imediatamente, enquanto que o IAsyncEnumerable<T> deve esperar até a próxima invocação do método MoveNext().

Geralmente considera-se suficiente o uso de Observable.Create para o modelo push. Já no modelo pull, que é baseado em IAsyncEnumerable<T>, a implementação é bem mais tediosa. Este é um local no qual as versões assíncronas das funções de iteração juntamente com a instrução yield return seriam muito úteis.

Definindo o consumidor

Ainda de acordo com HaloFour:

Do ponto de vista do consumo das sequências, elas provavelmente deveriam se comportar da mesma maneira. A instrução Observable.ForEach permite que a ação execute de forma concorrente e acredito que provavelmente seria muito intuitivo permitir que o corpo da instrução foreach tenha múltiplas linhas de execução (threads) concorrentes (assumindo que elas não são disparadas de um SynchronizationContext). Se a implementação for similar a forma como a instrução await funciona, qualquer intermediário (SequenceAwaiter, etc) poderia tratar os detalhes de composição dos resultados de uma instância de IObservable<T> ou um método de extensão poderia simplesmente torná-los em uma instância de IAsyncEnumerable<T>.

Nenhum exemplo da sintaxe foi apresentado até o momento, mas presume-se que terá a seguinte forma:

await foreach(var item in AsyncSource)

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT