我在创建的Web 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调用完成对此Web服务的调用:
$.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操作异步将给我带来什么好处?
在您的特定示例中,该操作根本不是异步的,因此您正在执行的操作是异步同步。您只是释放一个线程而阻塞另一个线程。不需要这样做,因为所有线程都是线程池线程(与GUI应用程序不同)。
在关于“异步同步”的讨论中,我强烈建议,如果您有一个内部实现了同步的API,则不应公开仅将sync方法包装在中的异步对象Task.Run。
Task.Run
我应该从公开异步方法的同步包装器吗?
但是,async在有实际异步操作(通常是I / O)的地方进行WebAPI调用时,而不是阻塞坐在并等待结果的线程,该线程将返回线程池并执行其他操作。总而言之,这意味着您的应用程序可以用更少的资源做更多的事情,并提高可伸缩性。
async