Iis 在现有代码上创建异步WebApi包装器

Iis 在现有代码上创建异步WebApi包装器,iis,asynchronous,asp.net-web-api,asp.net-web-api2,task-parallel-library,Iis,Asynchronous,Asp.net Web Api,Asp.net Web Api2,Task Parallel Library,我们正在使用WebAPI公开我们当前的逻辑/业务层。根据我的理解,如果我们想保证自身安全,避免请求的线程匮乏,我们应该制作异步WebAPI控制器,这样大量并发请求就可以弥补这个不足 我确实理解,由于底层服务/业务层是同步的,因此不会有性能提升。我们的目标只是通过大量并发请求 以下是我正在使用的代码: public async Task<IHttpActionResult> Get() { var result = await Task.Run(() => Servic

我们正在使用WebAPI公开我们当前的逻辑/业务层。根据我的理解,如果我们想保证自身安全,避免请求的线程匮乏,我们应该制作异步WebAPI控制器,这样大量并发请求就可以弥补这个不足

我确实理解,由于底层服务/业务层是同步的,因此不会有性能提升。我们的目标只是通过大量并发请求

以下是我正在使用的代码:

public async Task<IHttpActionResult> Get()
{
     var result = await Task.Run(() => Service.GetAllCompanies()); //existing business layer
     return Ok(result);
}

将底层包装到任务中,这有助于继续并实现目标。

我的理解是,如果等待的方法的实现不是异步的,那么您就没有真正实现您认为的目标。如果您有CPU绑定的服务方法,那么您只需从请求处理池中释放一个线程,然后从同一个池中启动一个新线程,请在执行任务时注意;因此,该切换会带来一些开销,但ASP.NET线程池仍在执行该工作,因此您还没有实现所需的功能

如果您可以将服务方法转换为纯代码或大部分纯异步代码,那么您将从自下而上的工作中获益


参考资料:

我的理解是,如果您等待的方法的实现不是异步的,那么您并没有真正实现您所认为的。如果您有CPU绑定的服务方法,那么您只需从请求处理池中释放一个线程,然后从同一个池中启动一个新线程,请在执行任务时注意;因此,该切换会带来一些开销,但ASP.NET线程池仍在执行该工作,因此您还没有实现所需的功能

如果您可以将服务方法转换为纯代码或大部分纯异步代码,那么您将从自下而上的工作中获益


参考:

最后,所有这些底层方法都会命中数据库,由于这是一段遗留代码,我们无法使它们异步。这意味着,如果您的db方法在我们的例子中不能是异步的,那么就不需要创建异步方法链API controller->Business->Implementation layer-对这些方法的质疑。工作负载只是分配给同一池中的另一个线程。实际上,Task.Run会受到影响,因为它会释放原始线程,然后使用并阻止另一个线程池线程。切换会产生CPU成本,但不会带来任何好处。在云上托管时,这意味着您将需要一台更大的计算机来为相同的负载提供服务。最后,所有这些底层方法都会访问数据库,而且由于这是一段遗留代码,我们无法使它们异步。这意味着,如果您的db方法在我们的例子中不能是异步的,那么就不需要创建异步方法链API controller->Business->Implementation layer-对这些方法的质疑。工作负载只是分配给同一池中的另一个线程。实际上,Task.Run会受到影响,因为它会释放原始线程,然后使用并阻止另一个线程池线程。切换会产生CPU成本,但不会带来任何好处。在云上托管时,这意味着您将需要一台更大的计算机来服务相同的负载。每个HTTP请求已经在一个单独的线程上运行,所以您不会获得任何东西。每个HTTP请求已经在一个单独的线程上运行,所以您不会获得任何东西。