昨天调程序,开了几十个线程,总有几个出不了,后来发现是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都可以。

这里这篇文章真的是描述得很仔细。

也是一位程序员碰到一样的问题的结局过程。