如何修复我的WebAPI2控制器以使用异步任务scability

时间:2015-11-04 11:45:51

标签: c# asp.net asp.net-web-api async-await

我们最近开发了一个ASP.Net WebAPI2,它使用跨越各个层的同步调用,如下所示。

enter image description here

现在我已经了解到出于稳定性原因最好使用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的所有函数的唯一其他选项,但这似乎很多工作。

所以我想知道这里是否有人必须接受类似的练习,解决问题的最佳方法是什么。

此致 基兰

1 个答案:

答案 0 :(得分:3)

  

我看到的其他选项只能修改所有图层和所有功能   使用异步,但接缝就像很多工作一样。

你是对的,编写一个暴露真正的异步方法的全新数据访问层是一项艰苦的工作,因为它通常需要从头开始重新编写。但是,如果您知道实际上需要可扩展性并且您已将其确定为当前的瓶颈,那么它最终将是值得的。

Task.Run中包装您的代码将不会有任何好处,正如您所说的那样,因为异步确实是一个线程池线程,而它在执行IO时是免费的,在这里您实际上正在使用另一个< / em>线程,而不是ASP.NET运行时已为您提供的线程。

总而言之,没有简单的魔法修复可以使这一切工作,它将要求您重新编写/添加异步端点到调用代码。