.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 异步不重要吗? 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • App Insights 升级到 2.5 后,Azure 应用服务将无法启动

    我有一个存储库 它使用应用程序洞察来记录有关在 ASP NET 中运行的服务的信息 我们有一些 ASP NET Core 2 0 站点以及一些完整框架的 asp net 4 应用程序 随着应用程序洞察 2 5 的发布 我们在核心站点中获得了
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 角度 2 ngIf 与可观察?

    我有一个非常简单的服务 它的工作是从 api authenticate url 获取 200 或 401 auth service ts Injectable export class AuthService constructor pri
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的

随机推荐

  • 在 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