C# 5.0 terá sintax sugar para operações assíncronas
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.
Conteúdo educacional
Complexidade organizacional no Século 21
Alexandre Magno 16 Mai, 2013

Olá visitante
Você precisa cadastrar-se no InfoQ Brasil ou Login para enviar comentários. Há muitas vantagens em se cadastrar.Obtenha o máximo da experiência do InfoQ Brasil.
Dê sua opinião