gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:00:30 25 4
gpt4 key购买 nike

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

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

这会在 255 次循环后导致异常。我尝试添加这一行(通过另一个stackoverflow帖子的一些建议)。
System.Net.ServicePointManager.DefaultConnectionLimit = 500;

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

有没有其他人看到过这个问题?你知道一个解决方法。

谢谢

最佳答案

WebClient 不会覆盖 Dispose它继承自 Component .

应该不需要调用 Dispose 并且我没有收到您提到的错误。请提及其他 stackoverflow 帖子。

事实上,WebClient 不会保留任何需要处理的状态,并且是非常无状态的。查看 Reflector 中的实现,很明显它负责处理这里的资源(方法 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;
}

关于.net - .Net 中的 WebClient 不释放套接字资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4070503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com