BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

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

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

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.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT