[英]How to fix my WebAPI2 controllers to use async Task for scability
我们最近开发了一个ASP.Net WebAPI2,它使用跨越各个层的同步调用,如下所示。
现在我已经了解到最好是出于稳定性原因使用Async Task
方法,但由于代码已经针对使用同步调用的大多数功能而开发,我想知道转换我的调用的最佳方法是什么。
说这是我的代码最初编写的方式:
[Route("user/{userId}/feeds ")]
[HttpGet]
public IEnumerable<NewsFeedItem> GetNewsFeedItemsForUserAsync(string userId)
{
return newsFeedService.GetNewsFeedItemsForUser(userId);
}
我可以把它转换成这样的东西:
[Route("user/{userId}/feeds ")]
[HttpGet]
public async Task<IEnumerable<NewsFeedItem>> GetNewsFeedItemsForUserAsync(string userId)
{
return await Task.Run(()=>newsFeedService.GetNewsFeedItemsForUser(userId));
}
但是,如果我理解正确,我认为这不会帮助我扩展我的网站,因为它仍将最终使用线程池线程。
我看到的唯一其他选项是修改所有图层和所有使用async
的函数,但这似乎很多工作。
所以我想知道是否有人在这里进行类似的练习以及解决问题的最佳方法是什么。
关心Kiran
只有其他选项我看到修改所有图层和所有函数使用异步,但接缝像很多工作。
你是对的,编写一个暴露真正的异步方法的全新数据访问层是一项艰苦的工作,因为它通常需要从头开始重新编写。 但是,如果你知道你实际上需要可扩展性并且你已经将它确定为当前的瓶颈,那么它最终将是值得的。
在Task.Run
包装你的代码将没有任何好处,正如你所说的那样,因为异步确实是一个线程池线程,而它在做IO时是免费的,在这里你实际上正在消耗另一个线程,而不是那个ASP。 .NET运行时已经为您提供了。
总而言之,没有简单的魔法修复可以使这一切工作,它将要求您重新编写/添加异步端点到调用代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.