Olá! Domingo, 19 de Maio de 2013.



Dicas CódigoFonte.net
Segunda Feira, 14 de Novembro de 2011

ASP.NET MVC 4 e Programação Assíncrona

Execução assíncrona é o futuro do desenvolvimento de aplicações para Windows

Nas versões anteriores do ASP.NET MVC era possível criar Controllers assíncronos herdando a classe AsyncController e usando algumas convenções:

- MyActionAsync: método que retorna void e lança um processo assíncrono
- MyActionCompleted: método que retorna um ActionResult (neste caso será o resultado da Action MyAction)

Para permitir que o MVC gerencie operações assíncronas e passe o resultado para a View, os desenvolvedores tinham que usar o AsyncManager do AsyncController.

Por exemplo, o controller abaixo permite obter uma lista de filmes serializada em Json de forma assíncrona a partir de um serviço OData:

  1. public class MoviesController : AsyncController
  2. {
  3.     public ActionResult Index()
  4.     {
  5.         return View();
  6.     }
  7.  
  8.     public void GetJsonMoviesAsync(int? page)
  9.     {
  10.         const int pageSize = 20;
  11.         int skip = pageSize * ((page ?? 1) - 1);
  12.         string url = string.Format("http://odata.netflix.com/[…]&$skip={0}&$top={1}",
  13.             skip, pageSize);
  14.  
  15.         //a operação assíncrona é declarada
  16.         AsyncManager.OutstandingOperations.Increment();
  17.  
  18.         var webClient = new WebClient();
  19.         webClient.DownloadStringCompleted += OnWebClientDownloadStringCompleted;
  20.         webClient.DownloadStringAsync(new Uri(url));//o processo assíncrono inicia
  21.     }
  22.  
  23.     private void OnWebClientDownloadStringCompleted(object sender,
  24.         DownloadStringCompletedEventArgs e)
  25.     {
  26.         // O processo assíncrono termina
  27.         // "movies" o resultado é adicionado aos parâmetros da AsyncManager
  28.         // Método GetJsonMoviesCompleted
  29.         List movies = null;
  30.         if (AsyncManager.Parameters.ContainsKey("movies"))
  31.         {
  32.             movies = (List)AsyncManager.Parameters["movies"];
  33.             movies.Clear();
  34.         }
  35.         else
  36.         {
  37.             movies = new List();
  38.             AsyncManager.Parameters["movies"] = movies;
  39.         }
  40.  
  41.         movies.AddRange(Movie.FromXml(e.Result));
  42.  
  43.         //Fim da operação assíncrona (chama a Action Completed)
  44.         AsyncManager.OutstandingOperations.Decrement();
  45.     }
  46.  
  47.     public ActionResult GetJsonMoviesCompleted(List movies)
  48.     {
  49.         //Retorna o resultado em Json
  50.         return Json(movies, JsonRequestBehavior.AllowGet);
  51.     }
  52. }
  53.  


Veja agora como podemos criar a mesma operação assíncrona acima, usando o ASP.NET MVC 4 e o C# 5 com as novas palavras chaves async e await, bem mais simples!:

  1. public class MoviesController : AsyncController
  2. {
  3.     public ActionResult Index()
  4.     {
  5.         return View();
  6.     }
  7.  
  8.     public async Task GetJsonMovies(int? page)
  9.     {
  10.         const int pageSize = 20;
  11.         int skip = pageSize * ((page ?? 1) - 1);
  12.         string.Format("http://odata.netflix.com/[…]&$skip={0}&$top={1}",
  13.                     skip, pageSize);
  14.  
  15.         var webClient = new WebClient();
  16.         string xmlResult = await webClient.DownloadStringTaskAsync(url);
  17.         return Json(Movie.FromXml(xmlResult), JsonRequestBehavior.AllowGet);
  18.     }
  19. }
  20.  
  21.  


Como você pode ver no código acima, no ASP.NET MVC 4 continua necessário herdar a classe AsyncController mas não há mais convenções de nomenclatura usando métodos Completed/Async

Referência: http://www.juliencorioland.net/Archives/en-aspnet-mvc-4-asynchronous-controllers


Por: Pedro Henrique Barbosa Fernandes (http://pedrofernandes.net)

Comentários do artigo [Novo comentário]

Nenhum comentário, seja o primeiro a comentar.
Para adicionar um comentário você deve efetuar o login


Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:





CodigoFonte.net » CodigoFonte.eti.br » Compre De Tudo » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010