从 HttpClient SendAsync 请求获取响应时出现无法解释的超时和延迟

2023-12-27

我们有一个 .NET 4.7.2,它混合使用异步和同步代码(我知道这是禁忌)。我们在 Windows 服务上使用 NancyFX。该服务获取休息呼叫并进行休息呼叫。线程池看起来很健康(整个进程只使用了 70 个线程)。由于某种原因,某些 http 响应会延迟 10 秒,有时甚至延迟 100 秒,并导致任务取消。

以下是代码的结构

public async Task<Guid> SomeFunction()
{
   ...
   var response = await _httpClient.SendAsync(request, cancellationToken);
   ...
}
SomeFunction().Result

首先,我确信由于某种原因,响应在网络上的某个地方被延迟了。但我们已经通过多种方式排除了这一点,最重要的是通过 perfview 查看 ETW 跟踪并查看数据包几乎立即返回(使用 Microsoft-Windows-NDIS-PacketCapture/PacketFragment)

其次,我确信这与异步方法上的 .Result 代码引起的线程池问题有关。然而,进程上的线程再次稳定在 70 个线程。通过 perfview 我可以看到饥饿确实没有发生(使用 Microsoft-Windows-DotNETRuntime/ThreadPoolWorkerThreadAdjustment/Adjustment)

我还想也许我遇到了等待/异步和 .Result 的死锁情况,但死锁意味着请求永远不会完成,而不是它会延迟 10 秒。

我还仔细检查过我们只使用了一个 httpclient 实例,而且确实如此。

还能是什么?

此时,我们正在删除 .Result 并将其替换为适当的 async/await。但我没有证据表明这会解决问题,因为我没有看到任何死锁或线程耗尽的证据。

Here is a perfview analysis enter image description here

我们还在研究有关我们正在以某种方式耗尽 http 连接的建议。我认为情况并非如此的原因之一是,根据 perfview,请求正在发送并且数据包返回,但响应并没有组成 c# 堆栈。然而,这些性能计数器可能表明存在一些排队现象。

Update我们已经增加了http连接,它似乎生效了。

<connectionManagement>
  <add address="*" maxconnection="1024"/>
</connectionManagement>

上面显示的排队完全消失了。然而,这些请求未完成的问题仍然存在


还能是什么?

您已经检查过我的第一个猜测,即线程池饥饿。

还有另一种可能性,具体取决于 API 调用的完成方式。如果同一主机有多个同时请求,则 .NET 网络堆栈可能会限制您的速度。非 ASP.NET 应用程序默认限制对同一主机同时发出 2 个请求。在这种情况下,您有一个服务器应用程序,但没有 ASP.NET 应用程序,因此默认情况下您会启用相当严格的限制。

建议:将此代码放入您的启动中:

ServicePointManager.DefaultConnectionLimit = int.MaxValue;

请注意,.NET Core 默认情况下不会限制客户端 HTTP 请求,因此这只是模拟现代 .NET 平台上的默认行为。

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

从 HttpClient SendAsync 请求获取响应时出现无法解释的超时和延迟 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 如何编写递归打印程序

    Gurus 我想知道如何编写一个打印的递归函数 1 12 123 1234 例如 display 4 应该打印 1 12 123 1234 Code include
  • Redux router - 刷新后如何重放状态?

    我有一个多步骤表单应用程序 我正在努力思考如何保存我的 redux 状态并在刷新后重播它 在应用程序中后退 前进按预期工作 但浏览器刷新后 我之前的状态为空 理想情况下 我希望能够将先前的状态保存在与路径相关的会话存储中 以便稍后重播 但我
  • 在 HTML 画布中创建链接

    是否可以从 canvas 元素中呈现的文本创建 html 链接 没有简单的方法 您必须将链接文本绘制到画布上 然后检查鼠标单击情况 这是一个演示 html 页面
  • 与泛型的多重绑定

    我正在尝试创建一个Multibinder
  • ASP Classic 应用程序中的多部分/表单数据和 UTF-8

    我有一个问题我真的不明白 我正在尝试在 ASP 经典应用程序中上传文件 而不使用外部组件 我还想发布一些将存储在数据库中的文本 文件上传完美 我正在使用以下代码 问题是其他表单输入字段 我使用的是 UTF 8 但它们最终并不是 UTF 8
  • 后期绑定onclick事件

    以下是我的 javascript 的一部分 使用 jquery list a b c for var i 0 i lt list length i a click here a click function foo list i appen
  • Java中如何实现“按引用调用”?

    Java中如何实现 按引用调用 假设我们使用该术语的方式与自 1960 年代以来同行评审的计算机科学文献中使用该术语的方式相同 请参阅这个维基百科页面 https en wikipedia org wiki Evaluation strat
  • 在 MFC 应用程序中显示文本

    我需要在 MFC 应用程序中显示文本 我有一个示例文本 例如 在 mfc 应用程序中显示文本 假设我打算在其中绘制此文本的客户端窗口非常小 水平 以至于在一行中唯一可以容纳的文本是 显示文本 不显示 mfc 应用程序 字样 我的问题是 如何
  • pjsip 2.5.5 构建错误

    我正在尝试为 android 构建 pjsipNDK r13b 标准构建就像 configure android with opus home user pjsip pjproject opus dev lib工作完美 但我需要几个TARG
  • 如何使用另一个数组的长度来初始化 Rust 中的数组?

    我想初始化一个数组 其长度等于另一个数组的长度 fn foo array i32 let mut sum 0 array len 它会出错 error E0080 constant evaluation error gt test rs 2
  • Pyspark:在数据帧的不同组上应用 kmeans

    使用 Pyspark 我想将 kmeans 单独应用于数据帧组 而不是立即应用于整个数据帧 目前 我使用 for 循环对每个组进行迭代 应用 kmeans 并将结果附加到另一个表 但是有很多组会很耗时 有人可以帮我吗 多谢 for cust
  • 如何使图像在图像墙内反弹?

    我面临这个问题 在动画过程中 我希望鱼图像在背景图像 池塘 中移动 并且每当它撞到墙壁或图像边界时它就会弹开 使用svg方法和javascript方法 非常感谢任何可以提供帮助的人 再次感谢您花时间阅读并帮助解决这个问题
  • 如何将临时 MySQL 表转储到文件中?

    有没有一种方法可以创建转储 导出 保存临时 MySQL 表到磁盘上的文件中 sql 文件 类似于 mysqldump 创建的文件 抱歉 我第一次没有正确阅读这个问题 无论如何 我能想到的最好的方法就是使用SELECT INTO OUTFIL
  • mongodb 从一个值获取整个文档

    我想从单个值获取 mongodb 文档的所有值 例子 id id name name description description invite invite support server server developer develop
  • 同一行有多个命令

    我一直在尝试找到一些可以让我在 Vim 中的同一行上运行多个命令的东西 类似于在 nix 系统中使用分号来分隔命令或 在Windows中 有没有办法做到这一点 A bar 将允许你这样做 从 help bar 可用于分隔命令 因此您可以在一
  • IoC 容器的使用;特别是温莎

    我认为这个问题的答案是如此明显 以至于没有人费心写这个 但已经晚了 我真的无法理解这个问题 我一直在阅读 IoC 容器 在本例中为 Windsor 但我不知道如何从代码的各个部分与容器进行通信 我得到了 DI 我已经做了穷人 DI 空构造函
  • 在 scala 中将其别名为 self =>

    一些 Scala API 别名this to self 例如 trait Function1 T1 R extends AnyRef self gt 我知道该怎样this别名通常有效 但没有看到像 Function1 这样的特征如何从中受益
  • 清理大型遗留 Java 项目

    我被指派去做一个大型Java项目的一些工作 开发人员的几次迭代的影响是显而易见的 没有标准的编码风格 格式 命名约定或类结构 当我遇到 Javadoc 类时真是美好的一天 单元测试是一个快乐的白日梦 到目前为止 我们参与该项目的人员一直在
  • if 条件在 nginxconf 中的 location 块内如何工作?

    我读过了https www nginx com resources wiki start topics 深度 ifisevil https www nginx com resources wiki start topics depth if
  • 从 HttpClient SendAsync 请求获取响应时出现无法解释的超时和延迟

    我们有一个 NET 4 7 2 它混合使用异步和同步代码 我知道这是禁忌 我们在 Windows 服务上使用 NancyFX 该服务获取休息呼叫并进行休息呼叫 线程池看起来很健康 整个进程只使用了 70 个线程 由于某种原因 某些 http