我在创建的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操作异步将给我带来什么好处?
您需要了解为什么要实现异步控制器,而许多人却没有。IIS具有有限数量的可用线程,当所有线程都在使用中时,服务器将无法处理新请求。使用异步控制器时,当一个进程在等待I / O完成时,它的线程被释放给服务器以用于处理其他请求。
—
Matija Grcic 2014年
您看到过哪些开发人员?如果有任何博客文章或文章推荐该技术,请发布链接。
—
Stephen Cleary 2014年
仅当您的流程从顶部(包括Web应用程序本身和控制器)开始感知到流程之外的任何可等待活动(包括计时器延迟,文件I / O,数据库访问,和网络发出的请求)。在这种情况下,您的委托助手需要一个
—
基思·罗伯逊
GetProductsWithHistoryAsync()
returning Task<CartTotalsDTO>
。如果您打算迁移控制器发出的异步调用,则将控制器编写为异步也会有好处;然后,您将在迁移其余部分时从异步部分中受益。
如果您正在执行的过程正在关闭并访问数据库,则您的Web线程只是在等待它返回并保持该线程。如果您达到最大线程数,并且另一个请求进入,则必须等待。为什么这样 相反,您希望从控制器中释放该线程,以便另一个请求可以使用它,并且仅在您的数据库原始请求返回时占用另一个Web线程。msdn.microsoft.com/zh-CN/magazine/dn802603.aspx
—
2016年
async Task<T>
。记住,在TPL甚至还没有存在之前就已经实现了AJAX :)