首页 > 解决方案 > HttpClient 挂起并发任务

问题描述

当我的应用程序启动时,我有大约 1000 个请求。调用 ~200 个请求后,仅返回 ~10 个,然后我的应用程序挂起,不再返回任何结果。

这是我的代码的样子:

// 文件 1.cs

await Task.WhenAll(allUsers.Select(user => Connect(user)));

// File2.cs(在 Connect 方法中调用)

var result = await client.PostAsync($"https://url.com", 
                    new FormUrlEncodedContent(parameters)))

HttpClient 是静态的,所以它不应该是太多实例的问题。

我尝试了以下解决方案:

  1. 设置 ServicePointManager.DefaultConnectionLimit = int.MaxValue
  2. 将 await client.PostAsync(...) 放在 using 语句中
  3. 使用 .ConfigureAwait(false)
  4. 设置超时值
  5. MaxDegreeOfParallelism 设置为 2 的 TPL 数据流 (ActionBlock)

上述解决方案都没有奏效,我的选择已经不多了。有什么理由不能/不会抛出异常或返回值吗?并发请求过多时是否有可能出现死锁?任何建议都会有所帮助。谢谢

附言。我正在使用.Net Core 2.1

标签: c#.net.net-corehttpclientdotnet-httpclient

解决方案


确保 api 中的操作已编写为异步方法(而不仅仅是控制器操作方法),并且更好地检查具有未提交事务隔离级别的正确 sql 脚本并选择没有锁定类型的基本并发执行实现的查询(如果sql db :) ) 因此 api 主要做一些数据库读取和写入


推荐阅读