我遇到了一些简单的测试代码问题,这些代码可以从我们的其中一个服务中进行批量下载。似乎调用Dispose没有释放低级别套接字。这是基本代码;
foreach(...)
{
using(WebClient client = new WebClient())
{
string results = client.DownloadString("http://host/request");
client.Dispose();
}
}
这会在255次循环后导致异常。我尝试添加此行(通过一些建议形成另一个stackoverflow帖子)。
System.Net.ServicePointManager.DefaultConnectionLimit = 500;
然后我在500次循环后得到一个异常。所以,在我看来,低级套接字连接没有被释放。
还有其他人看过这个问题吗?你知道一个解决方法吗?
由于
答案 0 :(得分:0)
您可以尝试调用GC.Collect强制GC运行,似乎这可能是您的问题
答案 1 :(得分:0)
您可以尝试使用HttpWebRequest代替WebClient
。根据我的经验,我通常可以更轻松地使用该API执行我想要的操作,但使用它并不是那么容易。我相信您可以使用HttpWebRequest
轻松控制连接。
答案 2 :(得分:0)
WebClient不会覆盖它从Dispose
继承的Component
。
不需要调用Dispose,我也没有得到你提到的错误。请提及其他stackoverflow帖子。
事实上,WebClient并没有保留任何需要使用dsiposing的状态,而且非常无状态。查看Reflector中的实现很明显它在这里管理reasources(方法DownloadDataInternal
从DownloadString
调用):
private byte[] DownloadDataInternal(Uri address, out WebRequest request)
{
byte[] buffer2;
if (Logging.On)
{
Logging.Enter(Logging.Web, this, "DownloadData", address);
}
request = null;
try
{
request = this.m_WebRequest = this.GetWebRequest(this.GetUri(address));
buffer2 = this.DownloadBits(request, null, null, null);
}
catch (Exception exception)
{
if (((exception is ThreadAbortException) || (exception is StackOverflowException)) || (exception is OutOfMemoryException))
{
throw;
}
if (!(exception is WebException) && !(exception is SecurityException))
{
exception = new WebException(SR.GetString("net_webclient"), exception);
}
AbortRequest(request);
throw exception;
}
catch
{
Exception exception2 = new WebException(SR.GetString("net_webclient"), new Exception(SR.GetString("net_nonClsCompliantException")));
AbortRequest(request);
throw exception2;
}
return buffer2;
}