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

Fas*_*ani 1 iis asynchronous task-parallel-library asp.net-web-api asp.net-web-api2

我们使用WebAPI公开当前的逻辑/业务层.根据我的理解,如果我们想要保护我们的自我免受线程饥饿的请求,我们应该制作Async WebAPI控制器,这样就可以弥补大量的并发请求.

我明白,由于底层服务/业务层是同步的,因此不会有性能提升.我们的目标是大量并发请求通过.

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

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

在任务中包装底层图层是很好的继续并实现目标.

Ron*_*gan 5

我的理解是,如果你的await-ed方法的实现不是异步的,那么你并没有真正实现你的想法.如果您有CPU绑定的服务方法,那么您只需从请求处理池中释放一个线程,然后再启动一个新线程(从同一个池中,请注意)当您Task.Run();从该交换机中产生一些开销时, ASP.NET线程池仍然在做工作,所以你没有达到你想要的.

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

参考:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx

  • 实际上`Task.Run`会*伤害*因为它释放原始线程然后使用并阻止另一个线程池线程.切换会产生CPU成本,无益.在云上托管时,这意味着您需要更大的机器来为相同的负载提供服务 (3认同)