天天看點

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能關閉連接配接的原理還請各位較真的同學自行研究,如果有成果,可以通知我哦!