我在创建的Web API中执行以下操作:
//获取api/<;控制器>;
[HttpGet]
[路线(“药房/{pharmacyId}/page/{page}/{filter?}”)]
公共CartTotalsDTO GetProductsWithHistory(Guid pharmacyId,int页,字符串筛选器=null,[FromUri]bool refresh=false)
{
返回delegateHelper.GetProductsWithHistory(CustomerContext.Current.GetContactById(pharmacyId),刷新);
}
通过以下方式通过Jquery Ajax调用完成对此Web服务的调用:
$.ajax({
url:“/api/products/pharmacies/<;Farmacia.PrimaryKeyId.Value.ToString()%>;/page/“+vm.currentPage()+”/“+filter,
键入:“获取”,
数据类型:“json”,
成功:功能(结果){
vm.项目([]);
var数据=结果产品;
vm.totalUnits(result.totalUnits);
}
});
我见过一些开发人员以这种方式实现前面的操作:
//获取api/<;控制器>;
[HttpGet]
[路线(“药房/{pharmacyId}/page/{page}/{filter?}”)]
公共异步任务<;CartTotalsDTO>;GetProductsWithHistory(Guid pharmacyId,int页,字符串筛选器=null,[FromUri]bool refresh=false)
{
返回wait Task.Factory.StartNew(()=>;delegateHelper.GetProductsWithHistory(CustomerContext.Current.GetContactById(pharmacyId),刷新));
}
不过,必须说,GetProductsWithHistory()是一个相当长的操作。考虑到我的问题和背景,让webAPI操作异步对我有什么好处
在您的特定示例中,操作根本不是异步的,因此您所做的是异步对同步。您只是在释放一个线程并阻塞另一个线程。没有理由这样做,因为所有线程都是线程池线程(与GUI应用程序不同)
在我关于“async over sync”的讨论中,我强烈建议,如果您有一个在内部同步实现的API,那么不应该公开一个异步对应项,它只是将同步方法包装在
Task.Run中
我应该为同步方法公开异步包装器吗
但是,在进行WebAPI调用时,如果存在实际的异步操作(通常是I/O),而不是阻塞线程并等待结果,则线程将返回到线程池,从而能够执行其他操作。总之,这意味着您的应用程序可以用更少的资源做更多的事情,并提高了可伸缩性