首页 > 解决方案 > 如何在控制器类 - Web API 中使用异步、并行任务?

问题描述

我试图通过使用异步或并行异步任务方法使我的 REST API 更具响应性。这是我的代码,它本质上是同步的。我不知道如何通过使用异步或并行 TPL 使其更具响应性。

 [HttpGet]
        public async Task<string> Get([FromQuery(Name = "number")] long number)
        {

这是原始同步代码 -

[HttpGet]
    public string Get([FromQuery(Name = "number")] long number)
    {
        ulong lastItem = (ulong)number;
        ulong fact = 1;
        for (ulong i = 1; i < lastItem; i++)
        {
            fact = fact * i;
        }
        return fact.ToString();
    }

我想在使用 REST API - 调用时使这段代码更快。我的计划是使用 Task Parallel,但我不确定我该怎么做?一旦我能做到,我会检查性能是否得到改善。

标签: c#async-awaitasp.net-web-api2

解决方案


async不会使任何事情变得更快,它的可扩展性功能可以间接提高性能,但是对于小型站点可能不会。

关于您的问题,进行此调用是没有意义async的,它是CPU 工作负载,它不会使用IO 完成端口,并且无论您采用哪种方式都会使用线程池线程并阻止它(因为没有更好的词)做。简而言之,没有IO Bound操作async可以发挥其真正的魔力

当然你可以做到这一点

return await Task.Run(() =>
{
   ulong lastItem = (ulong)number;
   ulong fact = 1;

   for (ulong i = 1; i < lastItem; i++)
   {
      fact = fact * i;
   }

   return fact;
});

但是发生了什么?,您只是在释放一个线程池线程,以使用/切换到另一个线程,然后返回......几乎没有任何好处。

IMO,你最好保持原样。


推荐阅读