Ho la seguente operazione in un'API Web che ho creato:
// 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);
}
La chiamata a questo servizio web viene effettuata tramite una chiamata Ajax Jquery in questo modo:
$.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);
}
});
Ho visto alcuni sviluppatori che implementano l'operazione precedente in questo modo:
// 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 dire, però, che GetProductsWithHistory () è un'operazione piuttosto lunga. Dato il mio problema e il contesto, in che modo mi avvantaggia rendere asincrona l'operazione webAPI?
GetProductsWithHistoryAsync()
essere restituito Task<CartTotalsDTO>
. Può esserci un vantaggio nello scrivere il tuo controller come asincrono se intendi migrare anche le chiamate che fa per essere asincrono; quindi inizi a trarre vantaggio dalle parti asincrone mentre migra il resto.
async Task<T>
. Ricorda, AJAX è stato implementato prima ancora che esistesse il TPL :)