具有 Task.Run 性能的 ASP.NET Web API 2 异步操作方法

2023-11-21

我正在尝试对几个 ASP.NET Web API 2.0 端点进行基准测试(使用 Apache bench)。其中一种是同步的,一种是异步的。

        [Route("user/{userId}/feeds")]
        [HttpGet]
        public IEnumerable<NewsFeedItem> GetNewsFeedItemsForUser(string userId)
        {
            return _newsFeedService.GetNewsFeedItemsForUser(userId);
        }

        [Route("user/{userId}/feeds/async")]
        [HttpGet]
        public async Task<IEnumerable<NewsFeedItem>> GetNewsFeedItemsForUserAsync(string userId)
        {
            return await Task.Run(() => _newsFeedService.GetNewsFeedItemsForUser(userId));
        }

看完后史蒂夫·桑德森的演讲我发出了以下命令ab -n 100 -c 10 http://localhost....到每个端点。

我很惊讶,因为每个端点的基准似乎大致相同。

根据 Steve 的解释,我期望异步端点的性能会更高,因为它会立即将线程池线程释放回线程池,从而使它们可用于其他请求并提高吞吐量。但数字看起来完全一样。

我在这里误解了什么?


Using await Task.Run创造"async"WebApi 是一个坏主意 - 你仍然会使用线程,甚至从用于请求的相同线程池.

它将导致一些不愉快的时刻,详细描述here:

  • 额外的(不必要的)线程切换到Task.Run线程池线程。类似地,当该线程完成请求时,它必须 进入请求上下文(这不是实际的线程切换,而是 确实有开销)。
  • 会产生额外的(不必要的)垃圾。异步编程是一种权衡:您获得更高的响应能力,但代价是更高的性能 内存使用情况。在这种情况下,您最终会为 完全没有必要的异步操作。
  • ASP.NET 线程池启发法因 Task.Run“意外”借用线程池线程而失效。我没有很多 在这里的经验,但我的直觉告诉我启发式 如果意外任务真的很短并且会恢复得很好 如果意外任务持续超过两个时间,就不能优雅地处理它 秒。
  • ASP.NET 无法提前终止请求,即,如果客户端断开连接或请求超时。在同步情况下, ASP.NET 知道请求线程并可以中止它。在里面 异步情况下,ASP.NET 不知道辅助线程池 线程是“用于”该请求的。可以通过使用来解决这个问题 取消令牌,但这超出了本博客文章的范围。

基本上,您不允许 ASP.NET 出现任何异步 - 您只需将受 CPU 限制的同步代码隐藏在异步外观后面。Async它本身对于 I/O 密集型代码来说是理想的,因为它允许以最高效率利用 CPU(线程)(I/O 不会阻塞),但是当您有计算密集型代码时,您仍然必须利用 CPU到同样的程度。

并考虑到额外的开销Task和上下文切换你会得到比简单的同步控制器方法更糟糕的结果。

如何使其真正异步:

GetNewsFeedItemsForUser方法应改为async.

    [Route("user/{userId}/feeds/async")]
    [HttpGet]
    public async Task<IEnumerable<NewsFeedItem>> GetNewsFeedItemsForUserAsync(string userId)
    {
        return await _newsFeedService.GetNewsFeedItemsForUser(userId);
    }

去做吧:

  • 如果它是某个库方法,则查找它的async变体(如果没有 - 运气不好,你将不得不寻找一些竞争的类似物)。
  • 如果它是使用文件系统或数据库的自定义方法,则利用它们的异步设施为该方法创建异步 API。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 Task.Run 性能的 ASP.NET Web API 2 异步操作方法 的相关文章

随机推荐

  • 自定义列表单击复选框

    我已经填充了一个ListActivity from a Cursor using SimpleCursorAdapter当单击其中一个列表项时启动另一个活动 我也在用ViewBinder对数据进行一些自定义转换 我想添加一个CheckBox
  • Docker 集群多个管理者和工人 Vs

    我有一个 3 节点 docker swarm 集群 我们可能需要 2 名经理 我知道在某一时刻只有一位领导者 由于它是一个 3 节点集群 我试图找到一些文献来了解多个管理器的优缺点 我需要此信息 因为在我的 3 节点集群中 如果我有 2 个
  • Jquery if then 语句获取 css 值

    我想检查是否div带有 CSSclass x has height auto 如果是的话我想要 使用 jQuery 脚本 css class a 从所有元素中删除css class y 如果不是 则脚本不必执行任何操作 谢谢 if div
  • 使用多核 CPU 与 gensim 训练 Doc2vec 时效率不高

    我使用24核虚拟CPU和100G内存用Gensim训练Doc2Vec 但无论修改核心数量 CPU使用率始终在200 左右 top htop 上面两张图显示了cpu使用率 这表明cpu没有得到有效利用 cores multiprocessin
  • 使用ReferenceQueue和WeakReference

    我想在其他线程不再引用 Closeable 对象时正确关闭它 我写了一些小测试 但在对象入队后 get 方法返回 null 即 poll 方法返回没有引用对象的正确对象 public static void main String args
  • 使用ggplot2在地图上绘制条形图?

    我想使用 ggplot2 为地图上的每个位置生成一个条形图 正如 xingmowang 使用基础图形和一些软件包所做的那样 http nzprimarysectortrade wordpress com 2011 10 02 let r f
  • 谷歌应用程序引擎上有像 pluto 或 jetspeed 这样的 Portlet 容器吗?

    我正在尝试在谷歌应用程序引擎上构建一些 portlet 服务器 作为开源 我想使用 JSR168 286 标准 但我认为以下限制 应用程序引擎将使它介于棘手和不可能之间 有没有人尝试过运行 jetspeed 或内部使用 pluto 的应用程
  • Rails 视图编码问题

    我正在使用 Ruby 2 0 和 Rails 3 2 14 我的视图中散落着几个 UTF 8 字符 主要是货币符号 如 和 等 我注意到一些 ActionView Template Error incompatible character
  • Spring指标中的@Timed注释

    I use TimedString Boot Rest 控制器上的注释 它工作正常 控制器中的方法调用服务中的方法 该方法也用注释 Timed 但是 后续服务 bean 中方法的此注释不起作用 我没有看到结果 metrics 为什么会发生这
  • 没有为此对象定义无参数构造函数。在 ASP.NET MVC 控制器中

    我确信这很简单 但我有点卡在这里 为我的应用程序定义的路由只是默认路由 我定义了以下控制器 namespace Baynes Wedding Web Controllers public class AdminController Cont
  • 当使用 ElementTree.iterparse() 清除树时,内存使用量是否会增加?

    import os import xml etree ElementTree as et for ev el in et iterparse os sys stdin el clear 在 ODP 结构上运行上述内容RDF dump结果总是
  • jQuery 和 TinyMCE:textarea 值未提交

    我在用jQuery and TinyMCE提交表单 但序列化存在问题 因为 Textarea 值未发布 这是代码
  • 如何检测键盘何时显示和隐藏

    如何检测应用程序中何时显示和隐藏键盘 在类的 ViewDidLoad 方法中设置监听有关键盘的消息 Listen for keyboard appearances and disappearances NSNotificationCente
  • Java:如何同步数组访问以及同步条件下的限制是什么

    我有一个 2x2 数组 有两个线程在其上运行 java中可以在数组上使用synchronized语句吗 锁定是如何工作的 java教程线程说synchronized语句适用于对象 所以我不确定它们的意思 另一个网站说我可以发表这样的声明 s
  • 中点公式溢出错误

    我正在学习算法 大o 我只是对此感到好奇 指某东西的用途 mid low high 2 通常不鼓励使用二分查找算法来获取中点 因为可能会出现溢出错误 为什么这会导致发生溢出错误 以及如何处理 mid low high low 2 防止这个错
  • Java中是否可以动态构建多维数组?

    假设我们有 Java 代码 Object arr Array newInstance Array class 5 那会跑吗 进一步说明 如果我们尝试这样的事情会怎样 Object arr1 Array newInstance Array c
  • 包含具有两个不同调用的脚本的原因是什么?

    我使用 HTML5 样板 并且 jQuery 在 HTML 页面中声明了两次 如下所示
  • ListView 中带有 onListItemClick 的可点击区域的宽度

    我正在尝试让 ListView 中的列表项可点击 目前它们是可点击的 参见我的屏幕截图 但它们只能在文本占据的矩形内点击 我在用着protected void onListItemClick ListView l View v int po
  • IE9+和其他浏览器CSS3 ch单位不一致

    IE9 claims支持chCSS单元 根据定义 该单位 等于当前字体的 0 ZERO U 0030 字形的高级度量 或者 更简单地说 0 字形的字符框宽度 这种解释似乎适用于 Firefox 10 和 Chrome 27 div styl
  • 具有 Task.Run 性能的 ASP.NET Web API 2 异步操作方法

    我正在尝试对几个 ASP NET Web API 2 0 端点进行基准测试 使用 Apache bench 其中一种是同步的 一种是异步的 Route user userId feeds HttpGet public IEnumerable