Views com métodos assíncronos em uma aplicação ASP.NET MVC 6

Continuando a série que explora a utilização de programação assíncrona para melhorar o desempenho de uma aplicação ASP.NET MVC, nesse post mostrarei como utilizar uma nova funcionalidade presente no ASP.NET MVC 6, que é a possibilidade de utilizar chamadas assíncronas dentro de uma view utilizando o Razor, que é a engine de renderização de HTML utilizada pelo framework.

Para contextualizar esse exemplo, é recomendado ler os posts anteriores da série:

http://www.dotnetflash.com.br/2015/01/melhorando-a-performance-percebida-com-views-parciais-assincronas/

http://www.dotnetflash.com.br/2015/01/utilizando-chamadas-assincronas-no-servidor-em-uma-aplicacao-asp-net-mvc/

No segundo post da série, implementei chamadas assíncronas para os métodos mais lentos, que causavam a queda do desempenho da aplicação. Vou utilizar essa mesma aplicação como base para exemplificar o uso de chamadas assíncronas dentro de uma view Razor.

Relembrando os métodos assíncronos utilizados para retornar as informações pesadas da view:

Para simular os métodos lentos, introduzi um atraso de 1 segundo na execução do RecuperarContasAPagarRecentesAsync() e 2 segundos no RecuperarLogsRecentesAsync(), utilizando o método Delay(Int32) da classe Task. Os métodos assíncronos em uma aplicação .Net retornam um objeto do tipo Task<TResult> e é justamente isso que vocês podem ver no exemplo de código acima. Implementamos os métodos lentos do nosso repositório de modo que eles retornem tasks a serem executadas quando a informação for necessária. Observe que não estamos utilizando a palavra reservada await para recuperar o resultado dos métodos assíncronos, e sim repassando as tarefas para as propriedades dos modelos das views:

Com essa nova implementação, só vamos utilizar o await para executar o resultado dos métodos dentro do código da view, conforme código abaixo:

A nova sintaxe do Razor nos permite fazer chamadas a métodos assíncronos dentro do código da view.

O ganho de desempenho utilizando essa técnica é de 30%, conforme mostra a tabela abaixo.

ViewTempo total de renderização da página
Com chamadas síncronas4,52 segundos
Com chamadas assíncronas3,17 segundos
Ganho de desempenho com chamadas assíncronas30%

Esse ganho de desempenho ocorre, pois a chamada de um método assíncrono utilizando a palavra reservada await não bloqueia a thread principal da aplicação, liberando-a para continuar a execução. No nosso exemplo, a view chama primeiro o método RecuperarContasAPagarRecentesAsync() e continua executando, até chamar o método RecuperarLogsRecentesAsync(). Com isso, o tempo de resposta melhora, pois uma função não fica esperando a outra terminar de executar para iniciar o seu processamento.

O modelo de programação assíncrona é uma tendência forte no mundo .Net e vemos que a Microsoft está cada vez mais incorporando esse paradigma dentro do framework, com o objetivo de facilitar e incentivar o uso. Vale a pena investir o seu tempo para dominar esse tipo de técnica, pois desempenho é um fator vital para qualquer aplicação.

Para ver uma demonstração ao vivo da aplicação, clique no link: http://razorasyncmvc6.azurewebsites.net

SHOW ME THE CODE!!

https://github.com/marcellalves/asp-net-mvc-6-razor-async

Para ampliar o conhecimento sobre esse assunto, leia também:

http://www.rodolfofadino.com.br/2014/11/asp-net-mvc-6-razor-com-suporte-ao-async-e-flush/

http://blog.stephencleary.com/2012/02/async-and-await.html (em inglês)