昨天调程序,开了几十个线程,总有几个出不了,后来发现是httpwebrequest的向网站的请求没有返回,一直等在那里出不来,后来设置了允许的并发连接数、连接的超时timeout的限定以及一些参数,果然,死的线程基本上没有了。但是发现偶尔会出现一两个还是会死在里面,特别是反复处理几批检索关键字后,偶尔会出现。于是我打开vs2010的多线程窗口,设置断点,在多线程窗口找到了死在那里的线程,并定位了死的语句,竟然是这一句。
我赶紧在语句后面加了一个注释,哈哈。
然后查找ReadToEnd()的资料,终于找到了一个说法。
GetResponseStream之后,所得到的Stream,通过StreamReader去读取,用ReadToEnd或ReadLine,有时候会无限期的挂掉;
所以,希望:
StreamReader的ReadToEnd或ReadLine,支持Timeout
以达到:
不会无限期的挂掉,而是超时后,就终止
这样代码中就可以通过多次获取html,而最终避开此单次的获得html有误,而达到程序正常运行的目的了。
具体实现方式是:
在发送web请求之前,对于HttpWebRequest,就去设置对应的参数ReadWriteTimeout,StreamReader的timeout也做设置
其默认值是300000=300 seconds = 5 minutes
此处,我改为300000 = 30 seconds
然后,后续在正常的GetResponse后,再去获得GetResponseStream而得到Stream,
对于Stream,去通过StreamReader读取,使用ReadToEnd或ReadLine都可以。
这里这篇文章真的是描述得很仔细。
也是一位程序员碰到一样的问题的结局过程。