ASP.NET Web API 2具有Task.Run性能的异步操作方法
我正在尝试使用几个ASP.NET Web API 2.0端点进行基准测试(使用Apache工作台)。 其中一个是同步和一个异步。
[Route("user/{userId}/feeds")] [HttpGet] public IEnumerable GetNewsFeedItemsForUser(string userId) { return _newsFeedService.GetNewsFeedItemsForUser(userId); } [Route("user/{userId}/feeds/async")] [HttpGet] public async Task<IEnumerable> GetNewsFeedItemsForUserAsync(string userId) { return await Task.Run(() => _newsFeedService.GetNewsFeedItemsForUser(userId)); }
在观看Steve Sanderson的演讲之后,我向每个端点发出了以下命令ab -n 100 -c 10 https://localhost....
我很惊讶,因为每个端点的基准测试似乎大致相同。
关闭史蒂夫解释说我期待异步端点更高效,因为它会立即将线程池线程释放回线程池,从而使它们可用于其他请求并提高吞吐量。 但数字看起来完全一样。
我在这里误解了什么?
使用await Task.Run
创建“异步” WebApi是一个坏主意 – 您仍将使用一个线程,甚至来自用于请求的同一线程池 。
这将导致一些不愉快的时刻在这里详细描述:
基本上,您不允许任何与ASP.NET的异步 – 您只需隐藏异步外观后面的CPU绑定同步代码。 Async
本身是I / O绑定代码的理想选择,因为它允许以最高效率利用CPU(线程)(不阻塞I / O),但是当你有Compute绑定代码时,你仍然必须利用它CPU程度相同。
考虑到Task
和上下文切换的额外开销,您将获得比使用简单同步控制器方法更糟糕的结果。
如何使其成为真正的ASYNC:
GetNewsFeedItemsForUser
方法应转为async
。
[Route("user/{userId}/feeds/async")] [HttpGet] public async Task> GetNewsFeedItemsForUserAsync(string userId) { return await _newsFeedService.GetNewsFeedItemsForUser(userId); }
去做吧:
上述就是C#学习教程:ASP.NET Web API 2具有Task.Run性能的异步操作方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/991019.html