Csharp/C#教程:ASP.NET Web API 2具有Task.Run性能的异步操作方法分享


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

(0)
上一篇 2021年12月23日
下一篇 2021年12月23日

精彩推荐