BT

C# 5: desenvolvimento facilitado de aplicativos paralelos e assíncronos com async e await

por Elemar Jr. em 20 Abr 2012 |

O C#, em sua quinta versão, facilitará, significativamente o desenvolvimento de aplicações paralelas e assíncronas. Com isso, a Microsoft espera que os aplicativos desenvolvidos para suas plataformas ofereçam uma experiência superior ao usuário, pois será mais fácil evitar "congelamentos" na interface quando da realização de tarefas com alta exigência de recursos, como o acesso a servidores remotos, cálculos intensivos ou processamento de I/O.

Atualmente, quase todas as operações com alta exigência de recursos, suportadas pelo .NET, possuem implementações síncronas e assíncronas (via Begin/End Pattern ou Callbacks). Na maioria dos casos, a solução assíncrona é mais complexa. A listagem que segue mostra a execução de uma requisição web assíncrona.

public void PrintLinksFromMSDNWithContinuation()
{
    var wc = new WebClient();
    wc.DownloadStringCompleted += wc_DownloadStringCompleted;
    wc.DownloadStringAsync(new Uri("http://msdn.microsoft.com/pt-br/"));
}
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    var regex = "href\\s*=\\s*(?:\"(?[^\"]*)\"|(?\\S+))";
    var matches = Regex.Matches(e.Result, regex);
    foreach (Match match in matches)
        Console.WriteLine(match.Groups[1]);
}

Observe que essa solução é consideravelmente mais complexa que a implementação síncrona:

public void PrintLinksFromMSDN()
{
    var response = new WebClient().DownloadString("http://msdn.microsoft.com/pt-br/");
    var regex = "href\\s*=\\s*(?:\"(?[^\"]*)\"|(?\\S+))";
    var matches =  Regex.Matches(response, regex);
            
    foreach (Match match in matches)
        Console.WriteLine(match.Groups[1]);
}

A diferença de complexidade faz com que, muitas vezes, programadores prefiram a segunda implementação no lugar da primeira, implicando em prejuízo na experiência do usuário (a consequência mais perceptível).

A simplificação presente na nova versão do C# possibilitará o desenvolvimento assíncrono de forma muito mais natural. Isso ocorrerá através da utilização de duas novas palavras-chave: async e await.

A listagem que segue mostra como ficaria a mesma implementação indicada acima, no C# 5.

public async void PrintLinksFromMSDNAsync()
{
    var response = await new 
         WebClient().DownloadStringTaskAsync("http://msdn.microsoft.com/pt-br/");
    var regex = "href\\s*=\\s*(?:\"(?[^\"]*)\"|(?\\S+))";
    var matches = Regex.Matches(response, regex);

    foreach (Match match in matches)
        Console.WriteLine(match.Groups[1]);
}

Como se pode ver, a lógica lembra muito a implementação síncrona. O resultado, entretanto, é assíncrono. (Vale lembrar ainda que async/await podem ser estendidos mediante aplicação do pattern Awaiter.)

A Microsoft já disponibilizou uma série de vídeos e tutoriais sobre o novo recurso da linguagem em uma página oficial. Além disso, já se pode utilizar async/await em ambiente de produção mediante a instalação de uma extensão no Visual Studio 2010.

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

Conteúdo educacional

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