我使用的是一个第三方库,它可以进行大量的http调用。通过反编译代码,我已经确定它正在创建和使用原始的HttpWebRequest,所有这些都转到一个单独的HttpWebRequest。问题是一些请求没有正确关闭。一段时间后,当库对它们调用GetRequestStream()*时,所有新的ConnectionLimit将永远阻塞。我已经确定这种阻塞是由于特定主机的ServicePoint上的ServicePoint造成的,该主机的默认值为2。换句话说,该库打开了2个请求,然后尝试打开第三个请求,该请求阻塞了。
我想防止这种阻塞。该库具有相当的弹性,并且会重新连接自身,所以如果我删除它已建立的现有连接也没什么问题。问题是我无法访问这个库生成的任何HttpWebRequest或HttpWebResponse。但是,我知道它访问的网址,因此我可以访问它的ServicePoint。
var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));(注意:在这些HttpWebRequests上启用了KeepAlive )
发布于 2014-05-23 04:59:03
这起作用了,尽管我不确定这是解决问题的最好方法。
var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
ConnectionLimit to int.MaxValue
ConnectionCount的后台线程。如果大于5,则调用CloseConnectionGroup()
MaxIdleTime to 1 hour (而不是默认值) 设置ConnectionLimit应防止阻塞。监视器线程将确保过多的连接永远不会同时处于活动状态。设置MaxIdleTime应该是一种后退。
https://stackoverflow.com/questions/8189468
复制相似问题