Eu tenho a seguinte operação em uma API Web que criei:
// GET api/<controller>
[HttpGet]
[Route("pharmacies/{pharmacyId}/page/{page}/{filter?}")]
public CartTotalsDTO GetProductsWithHistory(Guid pharmacyId, int page, string filter = null ,[FromUri] bool refresh = false)
{
return delegateHelper.GetProductsWithHistory(CustomerContext.Current.GetContactById(pharmacyId), refresh);
}
A chamada para este serviço da web é feita por meio de uma chamada Jquery Ajax desta forma:
$.ajax({
url: "/api/products/pharmacies/<%# Farmacia.PrimaryKeyId.Value.ToString() %>/page/" + vm.currentPage() + "/" + filter,
type: "GET",
dataType: "json",
success: function (result) {
vm.items([]);
var data = result.Products;
vm.totalUnits(result.TotalUnits);
}
});
Já vi alguns desenvolvedores que implementam a operação anterior desta forma:
// GET api/<controller>
[HttpGet]
[Route("pharmacies/{pharmacyId}/page/{page}/{filter?}")]
public async Task<CartTotalsDTO> GetProductsWithHistory(Guid pharmacyId, int page, string filter = null ,[FromUri] bool refresh = false)
{
return await Task.Factory.StartNew(() => delegateHelper.GetProductsWithHistory(CustomerContext.Current.GetContactById(pharmacyId), refresh));
}
Devo dizer, porém, que GetProductsWithHistory () é uma operação bastante longa. Dado o meu problema e contexto, como tornar a operação webAPI assíncrona me beneficiará?
GetProductsWithHistoryAsync()
devolvido Task<CartTotalsDTO>
. Pode haver uma vantagem em gravar seu controlador de forma assíncrona se você pretende migrar as chamadas que ele faz para serem assíncronas também; então você começa a tirar proveito das partes assíncronas conforme migra o resto.
async Task<T>
. Lembre-se, AJAX foi implementado antes mesmo de o TPL existir :)