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

时间:2016-09-13 01:35:42

标签: iis asynchronous asp.net-web-api asp.net-web-api2 task-parallel-library

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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