当前位置: 首页 > 面试题库 >

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

荀辰钊
2023-03-14
问题内容

我在创建的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

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

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



 类似资料:
  • 我见过一些开发人员以这种方式实现前面的操作: 不过,不得不说,GetProductsWithHistory()是一个相当长的操作。考虑到我的问题和上下文,使webAPI操作异步对我有什么好处?

  • 本文向大家介绍nodejs中require方法是同步还是异步操作?为什么?相关面试题,主要包含被问及nodejs中require方法是同步还是异步操作?为什么?时的应答技巧和注意事项,需要的朋友参考一下 同步 因为经常用到模块,并且一般都在模块顶端引入,所以把require做成同步,有助于代码整洁有序,增强可读性。 但是,I/O密集的地方尽量不要用require。所有的同步,都会阻塞Node,直到

  • 我刚刚发现,在react函数都是异步的,或者在调用它的函数完成后调用。 现在这两样东西很难消化 在博客中,函数是在函数内部调用的,但是触发函数的原因并不是被调用函数所知道的。 他们为什么要让异步,因为JS是单线程语言,而且这个setState不是WebAPI或服务器调用,所以只能在JS的线程上完成。他们这样做是为了使重新呈现不会停止所有事件侦听器和其他东西,还是有其他设计问题。

  • 概述 定时器 Promise 对象

  • 下面的这些操作符属于单独的rxjava-async模块,它们用于将同步对象转换为Observable。 start( ) — 创建一个Observable,它发射一个函数的返回值 toAsync( ) or asyncAction( ) or asyncFunc( ) — 将一个函数或者Action转换为已Observable,它执行这个函数并发射函数的返回值 startFuture( ) — 将

  • 尽管我花了几天时间研究了关于基于任务的异步模式(TAP)、async和await的MSDN文章,但我仍然对一些更精细的细节感到有点困惑。 我正在为Windows Store应用程序编写一个记录器,我希望同时支持异步和同步日志记录。异步方法跟随TAP,同步方法应该隐藏所有这些,并且看起来和工作起来像普通方法一样。 这就是异步日志的核心方法: 这看起来是正确的,但它并不起作用。整个程序永远冻结。 版本