天天看点

C# HttpWebRequest HttpWebReponse 挂起无反应,阻塞解决方案

关于连接被阻塞的解决方案有不少,通常如增加连接数目,如:System.Net.ServicePointManager.DefaultConnectionLimit = 512; 这个值据称一般不应大于1k,也有的说,应该在创建连接之前强制回收,如: System.GC.Collect(); 但以我的经验,这个也不大好使,有一次我抓取某个网页,我更改了最大连接数,也强制回收,也在使用完HttpWebReponse 之后立马close(),结果还是抓到一定数据量之后就阻塞住了,而且内存占用达到了300兆,这让我很沮丧,一度想用C++来重新代码,但是时间似乎也来不及,于是重新思考,我尝试关闭HttpWebRequest ,发现很奇怪的的是调用了HttpWebRequest 的Abort() 之后,响应流也没内容了,经过再三确认我发现了就是Abort()导致,这样我就有点想明白了,在C#中请求流和它对应的响应流是同一个,或者至少至少是紧密相关的,所以光关闭响应流是没有作用的,连接还是有系统维护着,并没有关掉(Abort的方法说明是取消对Internet资源的请求)。我发现经过我一上面的更改后,我的软件就再也没有出现连接阻塞的状态。

这里写出来,希望为遇到此问题的人提供帮助。

PS:关于Abort能关闭连接的原理还请各位较真的同学自行研究,如果有成果,可以通知我哦!