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.