1

我有一个每 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();
4

2 回答 2

0

您可能要考虑使用以下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, throughusing来实现所有对象IDisposable。当您在循环或低内存(低资源)系统中使用这些对象时尤其如此。

不过要小心流,他们倾向于使用装饰器模式,并且可能会调用Dispose它的所有“子”对象。

通常适用于:

  • 图形对象
  • 数据库连接
  • TCP/IP(http 等)连接
  • 文件系统访问
  • 带有本机组件的代码,例如 USB 驱动程序、网络摄像头等。
  • 流对象
于 2015-08-12T11:15:43.857 回答
0

神奇的数字“3”来自这里

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

于 2019-03-19T09:08:14.680 回答