第三次运行GetResponse()时出现超时错误

本文关键字:超时 错误 运行 GetResponse 第三次 | 更新日期: 2023-09-27 18:07:23

我有一个每60秒周期性运行一次的线程。这个线程正在从web url获取响应。在第三轮之前一切都很好。它不再工作,并显示以下错误:

"操作已超时"

这是我的代码,在第5行发现了错误。谢谢!

string sURL;
sURL = "http://www.something.com";
WebRequest wrGETURL;
wrGETURL = WebRequest.Create(sURL);
HttpWebResponse http = (HttpWebResponse)wrGETURL.GetResponse();
Stream objStream = null;
objStream = http.GetResponseStream();

第三次运行GetResponse()时出现超时错误

您可能需要考虑使用using语句:

string sURL;
sURL = "http://www.something.com";
using (WebRequest wrGETURL = WebRequest.Create(sURL))
{
    using (HttpWebResponse http = (HttpWebResponse)wrGETURL.GetResponse())
    {
        Stream objStream = http.GetResponseStream();
        //etc.
    }
}

保证调用Dispose方法,即使在发生异常的情况下也是如此。(https://msdn.microsoft.com/en-us/library/yh598w02.aspx)

超时的原因可能是您的服务器有x个同时请求的限制。由于处理不当,连接将保持打开的时间比需要的更长。尽管垃圾回收器会为您修复这个问题,但它的时机往往太晚了。

这就是为什么我总是建议调用Dispose,通过using实现IDisposable的所有对象。当您在循环或低内存(低资源)系统中使用这些对象时尤其如此。

小心流,它们倾向于使用装饰器模式,并可能在其所有的"子"对象上调用Dispose

通常适用于:

    <
  • 图形对象/gh>数据库连接
  • TCP/IP (http等)连接
  • 文件系统访问
  • 带有本地组件的代码,如usb驱动程序,摄像头等
  • <
  • 流对象/gh>

神奇的数字"3"来自这里:

ServicePoint对象允许的最大并发连接数。ASP的默认连接限制是10。. NET托管应用程序和2用于所有其他应用程序。