BT

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

Contribuir

Tópicos

Escolha a região

Início Notícias C# 5.0 terá sintax sugar para operações assíncronas

C# 5.0 terá sintax sugar para operações assíncronas

Favoritos

O time de desenvolvimento de .NET da Microsoft anunciou nessa última semana que a próxima versão da linguagem C# terá uma nova sintaxe, mais enxuta, para realizar operações assíncronas.

Atualmente, para realizar uma tarefa assíncrona é necessário utlizar callbacks, seja declarando métodos separados ou utilizar métodos anônimos. Veja um exemplo de uma requisição Web assíncrona utilizando um método anônimo como callback em uma aplicação console:

static void Main(string[] args)
{
  var request = WebRequest.Create("http://www.infoq.com/br");
  Console.WriteLine("Inicio do método: {0}", DateTime.Now.TimeOfDay);

  request.BeginGetResponse(asyncResult =>
  {
    using (var response = request.EndGetResponse(asyncResult))
    {
      using (var reader = new StreamReader(response.GetResponseStream()))
      {
        Console.WriteLine("Leitura da resposta: {0}", DateTime.Now.TimeOfDay);
        Console.WriteLine(reader.ReadToEnd());
      }
    }
  }, null);

  Console.WriteLine("Fim do método: {0}", DateTime.Now.TimeOfDay);
}

O resultado do código acima seria algo do tipo:

Inicio do método: 22:50:44.6406250
Fim do método: 22:50:44.7187500
Leitura da resposta: 22:50:45.9687500
<html>
  <head>
    <title>
      InfoQ: Rastreando mudança e inovação na comunidade de desenvolvimento de software corporativo.
    </title>
...

No C# 5.0, com a utilização dos novos comandos async e await, essa tarefa ficará muito mais fácil de escrever. Veja o mesmo exemplo acima utilizando a nova syntax sugar:

static void Main(string[] args)
{
  var request = WebRequest.Create("http://www.infoq.com/br");
  Console.WriteLine("Inicio do método: {0}", DateTime.Now.TimeOfDay);

  using (var response = await request.GetResponseAsync())
  {
    using (var reader = new StreamReader(response.GetResponseStream()))
    {
      Console.WriteLine("Leitura da resposta: {0}", DateTime.Now.TimeOfDay);
      Console.WriteLine(await reader.ReadToEndAsync());
    }
  }

  Console.WriteLine("Fim do método: {0}", DateTime.Now.TimeOfDay);
}

O resultado é o mesmo do exemplo anterior, mas a legibilidade do código e a forma como as coisas acontecem melhoraram muito.

A palavra-chave await informa ao compilador que o método sendo chamado retorna um objeto Task<>, este usado pela Task Parallel Library para executar uma operação assíncrona. No exemplo acima, foi chamado assíncronamente o método GetResponseAsync da instância de WebRequest armazenada na variável response.  A declaração desse método utiliza a palavra-chave async, para dizer ao compilador que o mesmo pode ser chamado usando await.

public override async WebResponse GetResponse()

Note também que foi usado await para ler o conteúdo do stream, tornando essa tarefa também assíncrona.

Todos esses novos recursos também farão parte do Visual Basic 11, mas ainda não há nenhuma previsão para a liberação da versão 5.0 de C# e/ou .NET Framework.

Para obter mais informações sobre programação assíncrona em .NET vá em http://msdn.com/vstudio/async. Inclusive é possível baixar uma versão CTP do Visual Studio com os novos recursos mostrados aqui.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT