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.

Avalie esse artigo

Relevância
Estilo/Redação

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 mensagens dessa discussão
Comentários da comunidade

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

Receber mensagens dessa discussão

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

Receber mensagens dessa discussão

Dê sua opinião
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.