.Net Core Web Api 异步不重要吗?

2024-04-26

我一直在编写我的 Web Api 控制器方法async关键字并一直在使用async一直往下。我最近尝试创建一个方法同步来看看它会如何影响性能,并惊讶地发现它对任何其他 http 请求都没有阻塞影响。

举个例子——

[Route("Foo")]
class FooController {
  [HttpGet("Hello")]
  public string GetHello()
  {
    Thread.Sleep(100000); // 100 seconds
    return "Hello";
  }

  [HttpGet("Goodbye")]
  public string GetGoodbye()
  {
    return "Goodbye";
  }
}

有了这个我可以运行GET => /Foo/Hello后面跟着任意数量的GET => /Foo/Goodbye我的请求没有被阻止Goodbye端点。

我原本以为我会required使 Hello 方法异步,以便对 Goodbye 端点的请求能够立即返回。但是使这个方法同步/异步没有效果!

很困惑。 Web Api 应用程序不需要异步吗?为什么推荐?


事情没那么简单。

有一种东西叫做线程池。对应用程序的每个请求都会分配给从线程池中获取的单独线程。这是一个请求不会阻止另一个请求的第一个原因。

现在,当流量较低时,一切都很好,因此您不会达到线程池中线程的限制数量。但...

为了便于讨论,假设您的请求平均需要 1 秒,并且您的线程池大小 = 100。您将在第 101 个请求时开始遇到限制。那个,因为没有线程池分配给它,所以必须等待第 100 个请求完成,将线程释放回线程池,然后才能得到处理。

现在,根据您的请求的作用,异步可以提供帮助(但也可能导致问题,所以不要盲目使用它!):

  1. 如果您的请求执行 I/O 操作(网络调用、文件系统、数据库异步等),那么这些操作将在 I/O 线程上工作。这些不是来自线程池。因此,想象一下传入的请求并触发网络调用或文件读取,需要 0.93 秒。这实际上意味着,如果您不使用异步,那么您的线程池线程在 0.93 秒内没有任何用处,它只是坐在那里等待 IO 线程完成。 在那些情况下,async可能非常有用,因为一旦它击中await关键字(与使用 IO 线程的操作一起使用)它将立即从线程池中释放线程,以便可以处理下一个请求。 一旦IO操作完成,它就会从线程池中获取一个线程来提供响应。

  2. 如果您的请求不使用任何 IO 操作,但您强制它们使用异步(有多种方法可以做到这一点),那么您实际上要做的就是将一个线程池线程(用于接收请求的初始线程)交换为另一个线程池线程一个(将需要运行该操作)。在这种情况下,您只会产生开销并损失性能。

但是,无论如何,我有一种感觉与你的问题并不严格相关。 在上述两种情况中的任何一种中,您的方法都在两个单独的请求中运行,并且几乎与async/await但在服务器环境中,请求是独立处理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net Core Web Api 异步不重要吗? 的相关文章

随机推荐

  • 在 iOS 中禁用文本选择标注

    我知道当用户长按某个按钮时您可以禁用标注link使用这个 body webkit touch callout none important a webkit user select none important 但是文本选择菜单呢 我的用例
  • 重写具有不同返回类型的成员函数

    考虑下面的例子 include
  • 在 Julia 中提取参数类型

    假设我在 Julia 中编写了一个函数 它接受Dict K V 作为参数 然后创建类型的数组Array K 1 and Array V 1 我怎样才能提取类型K and V来自 Dict 对象 以便我可以使用它们来创建数组 斯文和约翰的答案
  • 仅适用于数字和连字符的正则表达式

    我试图理解正则表达式 对于长度为 10 的数字我可以简单地做 0 9 10 对于连字符只有我能做 使用组表达式将两者结合起来将导致 0 9 10 该表达式无法按预期工作 如果字符串无效 它会以某种方式匹配字符串的一部分 而不是根本不匹配 如
  • Hibernate无法打开连接

    我在休眠时遇到问题 无法打开连接 我有一个 DAO public class MyDao extends HibernateDaoSupport DataSource dataSource public void setDataSource
  • 安卓浏览器有bug? div溢出滚动

    你能让div的溢出内容在Android浏览器中滚动吗 它在所有其他现代浏览器中都是可滚动的 在 iOS 中 它是可滚动的 但它不显示滚动条 但可以通过拖动来滚动 一个简单的例子 http jsfiddle net KPuW5 1 embed
  • .hide("slow") 是同步方法还是异步方法?

    据我们所知 ajax 是一个异步方法 因为下一个语句之前开始执行ajax 方法已完全执行 ajax 继续并行执行其工作 并且hide 是一个同步方法 因为它立即隐藏元素 并且下一条语句将在何时执行hide 确实完成了他的全部任务 但我真的很
  • 此 xpath 查询的 Flex/AS3/E4X 等效项是什么?

    鉴于此文档
  • 一个应用程序的最大线程数?

    我想知道一个应用程序的最大线程数 您知道 Thread activeCount 返回正在运行的线程组及其子组中的活动线程数 如果我知道当前活动中要创建的最大线程数 我就可以限制活动线程 我正在使用线程进行 http 连接并捕获 Http 响
  • 类通过回调提供数据

    在用 C 编程一段时间后 我最近回到了 Visual C 因为 C 中的回调要容易得多 我有一个控制 0 连接设备的单例类 我的想法是在此类中创建一个函数 它将迭代一组 连接的设备并通过回调将其发布到任何可能需要它的地方 e g Singl
  • C++ 或 Java 中保存 20 位整数的数据类型

    Java 或 C 中是否有可以保存 20 位或更多数字的整数值的数据类型 long long 数据类型最多只能容纳 18 位数字 Java具体 您正在寻找BigInteger http docs oracle com javase 7 do
  • 如何在H2中定义Oracle Package procedure进行测试

    我正在测试一个 Spring Boot 应用程序 该应用程序将数据读取 写入 Oracle DB 该 Oracle DB 具有 Oracle 包以及这些包中的过程 在某些时候 Spring Boot应用程序通过实体存储库调用此过程 如下所示
  • 模拟 with 语句中使用的类

    我有一堂课有一个 exit and enter 函数 以便我可以在 with 语句中使用它 例如 with ClassName as c c do something 我现在正在尝试编写一个单元测试来测试这一点 基本上 我想测试一下do s
  • 运行时静默更新应用程序

    我的应用程序最初将使用 Windows Installer 进行部署 我正在寻找的解决方案的主要特征包括 支持应用程序静默更新 运行 或自动重启 客户 易于维护和管理包装 过程 避免复杂的定制或 安装脚本 您对我如何实现这一目标有什么想法吗
  • 如何测试两个哈希值(密码)是否相似?

    当用户创建密码时 我对其进行哈希处理 包括盐 并将其保存在数据库中 现在 当用户想要更改他或她的密码时 我想测试新密码是否与旧密码太相似 我已经在不同的服务上看到过这种情况 尤其是网上银行 所以 我想我会使用similar text or
  • 更改 DataGridViewComboBoxColumn 单元格的背景颜色

    我创建了一个 DataGridView 对象 其中包含 DataGridViewComboBoxColumn 类型的列 以允许用户从下拉列表中选择值 例如 如果用户选择 高 我想对组合框的背面进行着色 但是 它不会为组合框着色 而只会为组合
  • 如何使用程序集绑定重定向来忽略修订号和内部版本号

    我有几个 C NET 应用程序 以及供它们访问数据库的 API 我想将 API 的所有版本放入数据库中 并让它们选择最高版本和内部版本号 但坚持使用它们构建时使用的主要版本号和次要版本号 基本上当我参考API时1 2 3 4我想要参考阅读1
  • 基于github仓库的本地仓库创建本地git仓库并保持更新

    我有一些基本的 git 知识 但我不知道如何实现这一点 我正在尝试克隆 github WordPress 入门主题下划线 https github com automattic s 这个想法是创建一个基本框架based 经过一些修改 在该存
  • 无法将 PHP 表单放入表格中

    我创建了一个工作正常的表单 但是当我将其放入表格中时 它总是认为该表单不完整 有没有办法可以将其放入表格中 这样看起来不错 而不会出现此问题 我的 HTML h2 class green Interested in making life
  • .Net Core Web Api 异步不重要吗?

    我一直在编写我的 Web Api 控制器方法async关键字并一直在使用async一直往下 我最近尝试创建一个方法同步来看看它会如何影响性能 并惊讶地发现它对任何其他 http 请求都没有阻塞影响 举个例子 Route Foo class