【问题标题】:HttpClient hangs with concurrent tasksHttpClient 挂起并发任务
【发布时间】:2018-12-22 01:02:47
【问题描述】:

当我的应用程序启动时,我发出了大约 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. TPL 数据流 (ActionBlock),MaxDegreeOfParallelism 设置为 2

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

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

【问题讨论】:

  • 是的,您可能不想同时发出 1000 个请求。线程池和连接池可能已满。尝试做 5 个批次。
  • 试过了。没用。我也更新了我的问题
  • 你尝试的时候发生了什么?
  • 这两行没有任何问题,但您将不得不显示更多代码。查看您的整个Connect() 方法会有所帮助。 allUsers 是如何填充的(如果是 IEnumerable,它可能会在枚举时被填充,这会影响它的工作方式)?
  • 我也看不出这两行有什么问题。我建议完全注释掉网络调用,看看你的逻辑中是否存在其他死锁缺陷。

标签: c# .net .net-core httpclient dotnet-httpclient


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2018-12-10
    • 2019-03-03
    • 1970-01-01
    相关资源
    最近更新 更多