.Net中的WebClient不释放套接字资源

时间:2010-11-01 15:51:34

标签: .net resources

我遇到了一些简单的测试代码问题,这些代码可以从我们的其中一个服务中进行批量下载。似乎调用Dispose没有释放低级别套接字。这是基本代码;

foreach(...)
{
  using(WebClient client = new WebClient())
  {
    string results = client.DownloadString("http://host/request");
    client.Dispose();
  }
}

这会在255次循环后导致异常。我尝试添加此行(通过一些建议形成另一个stackoverflow帖子)。

System.Net.ServicePointManager.DefaultConnectionLimit = 500;

然后我在500次循环后得到一个异常。所以,在我看来,低级套接字连接没有被释放。

还有其他人看过这个问题吗?你知道一个解决方法吗?

由于

3 个答案:

答案 0 :(得分:0)

您可以尝试调用GC.Collect强制GC运行,似乎这可能是您的问题

答案 1 :(得分:0)

您可以尝试使用HttpWebRequest代替WebClient。根据我的经验,我通常可以更轻松地使用该API执行我想要的操作,但使用它并不是那么容易。我相信您可以使用HttpWebRequest轻松控制连接。

答案 2 :(得分:0)

WebClient不会覆盖它从Dispose继承的Component

不需要调用Dispose,我也没有得到你提到的错误。请提及其他stackoverflow帖子。

事实上,WebClient并没有保留任何需要使用dsiposing的状态,而且非常无状态。查看Reflector中的实现很明显它在这里管理reasources(方法DownloadDataInternalDownloadString调用):

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;
}