为什么我应该创建异步WebAPI操作而不是同步操作?

我在创建的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),而不是阻塞线程并等待结果,则线程将返回到线程池,从而能够执行其他操作。总之,这意味着您的应用程序可以用更少的资源做更多的事情,并提高了可伸缩性

发表评论