У веб-API я створив таку операцію:
// 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);
}
Виклик до цієї веб-служби здійснюється через дзвінок Jquery Ajax таким чином:
$.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);
}
});
Я бачив деяких розробників, які реалізують попередню операцію таким чином:
// 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));
}
Треба сказати, що GetProductsWithHistory () - досить тривала операція. З огляду на мою проблему та контекст, як користь для мене асинхронної роботи webAPI?
GetProductsWithHistoryAsync()
повернення Task<CartTotalsDTO>
. У написанні асинхронного контролера може бути користь, якщо ви також маєте намір перенести виклики, які він робить для асинхронізації; тоді ви починаєте отримувати користь від частин асинхронізації під час міграції решти.
async Task<T>
. Пам'ятайте, AJAX був втілений ще до того, як TPL навіть існував :)