首页 新闻 会员 周边 捐助

HttpClient 奇葩问题,急急急急急急急!

1
悬赏园豆:160 [已解决问题] 解决于 2017-10-30 10:52

 一个循环一直调用SyncInvRquest()这个方法。

有时候循环完了不报错。

有时候循环到一半就报错。

都是post的同样的数据。

谢谢各位大哥!

 

 

 

 

 

 

 

 

欢呼雀跃的主页 欢呼雀跃 | 初学一级 | 园豆:28
提问于:2017-10-23 15:16
< >
分享
最佳答案
1

我猜 是由于post 数据接收方,数据处理能力不足,导致post方法异常,如果是这个问题可以捕获下异常。

收获园豆:160
放逐人 | 小虾三级 |园豆:694 | 2017-10-23 18:21

 应该不是,循环里加了Thread.Sleep(500)

欢呼雀跃 | 园豆:28 (初学一级) | 2017-10-24 09:21
其他回答(5)
0

循环里调用SyncInvRquest()这个方法的时候,前面加个延时,阻塞线程半秒试试~~ Thread.Sleep(500); 

顾星河 | 园豆:7281 (大侠五级) | 2017-10-23 15:45
0

看下那个聚合异常内部的异常是什么

ps,不要使用Wait,.Result等方式来强制同步结果,代码中要么全异步,要么全同步,不要混合在一起,这样可以避免很多很难发现的死锁问题。

Daniel Cai | 园豆:10424 (专家六级) | 2017-10-23 16:37
0

把HttpClient放在循环外面new,不要每次都new一个,不要.Result这样用,容易死锁。

Timetombs | 园豆:3959 (老鸟四级) | 2017-10-23 17:33

一开始我也放在外面的,也不行

支持(0) 反对(0) 欢呼雀跃 | 园豆:28 (初学一级) | 2017-10-23 18:11
0

官方曾经给出说明,太多httpclient会造成socket阻塞,用静态的httpclient

roberg | 园豆:204 (菜鸟二级) | 2017-10-24 09:39

 一开始用的是静态的,也报错

支持(0) 反对(0) 欢呼雀跃 | 园豆:28 (初学一级) | 2017-10-24 13:06
0

既然 HttpClient 使用这么 频繁,建议 可以 单独 拎出来 作为 静态对象。

以便于 多次 重复使用。

另外 为什么要 调用 Wait ?

应该直接 获取 Result 才对啊。

SoarNo1 | 园豆:195 (初学一级) | 2017-10-26 13:22

 上面的都试过了

一开始直接用的静态, Result 获取结果

但是还是有时候报错

有时候不报错

坑人啊

支持(0) 反对(1) 欢呼雀跃 | 园豆:28 (初学一级) | 2017-10-26 15:30

@农村外出务工人员: 

建议 去看看 AggregateException 的 异常结构 http://www.cnblogs.com/ProJKY/p/AggregateExceptionDesign.html

和异常处理。

http://www.cnblogs.com/Jusfr/archive/2012/05/29/2523795.html

 

捕获该异常。

另外 HttpClient一般也不是 给你 这样 循环用的。

而是应该 把循环的请求  合并为一个请求 例如 通过 传送 json 对象 数组

然后 一次获取多个结果。

 

我认为 这个异常可能是 因为 你 调用的次数 太频繁 或者 产生的错误太多 有一定的关系。

即使 单个 线程中 你的 循环是同步的 但是不同的请求还是会产生N个 并行执行的调用。

无论如何 还是尽量:

1.使用单例对象。

2.合并N个请求变为一个,减少请求次数。

3.捕获 并 输出 AggregateException 这个错误的具体信息 以供分析。

 

 

支持(0) 反对(0) SoarNo1 | 园豆:195 (初学一级) | 2017-10-27 03:21

@SoarNo1: 谢谢,找到了原因,是API那边的原因.

支持(0) 反对(0) 欢呼雀跃 | 园豆:28 (初学一级) | 2017-10-30 10:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册