BT

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

por Fernando Hamasaki de Amorim em 04 Nov 2010 |

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.

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2013 C4Media Inc.
Política de privacidade
BT