小编典典

为什么要创建异步WebAPI操作而不是同步操作?

ajax

我在创建的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操作异步将给我带来什么好处?


阅读 364

收藏
2020-07-26

共1个答案

小编典典

在您的特定示例中,该操作根本不是异步的,因此您正在执行的操作是异步同步。您只是释放一个线程而阻塞另一个线程。不需要这样做,因为所有线程都是线程池线程(与GUI应用程序不同)。

在关于“异步同步”的讨论中,我强烈建议,如果您有一个内部实现了同步的API,则不应公开仅将sync方法包装在中的异步对象Task.Run

我应该公开异步方法的同步包装器吗?

但是,async在有实际异步操作(通常是I /
O)的地方进行WebAPI调用时,而不是阻塞坐在并等待结果的线程,该线程将返回线程池并执行其他操作。总而言之,这意味着您的应用程序可以用更少的资源做更多的事情,并提高可伸缩性。

2020-07-26