![](/img/trans.png)
[英]An unhandled exception of type 'System.ObjectDisposedException' occurred in System.dll
[英]ObjectDisposedException for TCPClient.Close in System.dll?
我正在使用一个名为xNet的请求系统,似乎出现了ObjectDisposedException,该异常在发生时会导致巨大的CPU峰值,有时会持续将CPU保持在99%至100%之间,从而导致冻结和滞后。
提到的脚本如下: https : //github.com/PR4GM4/xNet-Ameliorated
示例代码是:
using (HttpRequest httpRequest = new HttpRequest()) {
string url = "https://httpbin.org";
string[] proxysplit = proxy.Split(':');
httpRequest.Proxy = new InternalProxyClient(ProxyType.HTTP, proxysplit[0], int.Parse(proxysplit[1]), null, null);
httpRequest.UserAgent = Http.ChromeUserAgent();
httpRequest.KeepAlive = true;
httpRequest.ConnectTimeout = 15000;
httpRequest.AllowAutoRedirect = true;
HttpResponse hr = httpRequest.Start(HttpMethod.GET, new Uri(url, UriKind.Absolute), new StringContent(""));
if (hr == null) return "2";
string sr = hr.ToString();
if (sr == null) return "2";
}
(如果需要一个半/死代理的列表,我可以提供,只是不确定是否允许链接到它们。) 这里要注意的是,它似乎只会在出现某种其他异常(例如失败)时发生连接到代理服务器,或响应一般错误,因此,良好的连接代理和/或根本没有代理永远不会出现此问题(除非再次出现常规失败的错误)。 如果循环这段代码,并给它一个死代理(为了加快处理速度,一次将其多线程化到大约5个线程),它将最终导致异常,例如响应错误或超时,并最终导致objectdisposedexception。 我尝试在Visual Studio中进行调试,但几乎没有任何信息,“历史调试”仅提供“找不到源”的信息。
在上面的屏幕快照中,调用ObjectDisposedException引发的第一个异常的堆栈。
似乎与线1430
在~Http/HttpRequest.cs
或线217
在~Proxy/ProxyClient.cs
,因为它是我知道这就是存在做EndConnect插座,也不约而同地能产生的ObjectDisposedException唯一的线。 只是不确定如何在此处正确处理异常而不会导致脚本的其余部分失败。 另外,为什么这里有一个简单的异常会导致如此多的CPU峰值?
奇怪的是,无论我如何包装ObjectDisposedException的异常处理程序,无论代码多少或在哪里包装,它都不会被触发? (在两个脚本上)
try
{
tcpClient.EndConnect(ar);
}
catch (Exception ex)
{
connectException = ex;
}
我发现了为什么,这不是因为两个文件中的.EndConnect引起的,它实际上是由.Close()调用引起的,因为它确实在其中包含.EndConnect,这就是为什么我看不到任何“ Source”等。
造成这种情况的原因是未连接套接字连接,所以执行.Close()会导致异常。
这是一个简单的修复。
(其中tcp = TcpClient)
执行以下操作,而不只是执行tcp.Close()
超时(最有可能从来没有连接的地方):
if (tcp.Client.Connected) {
tcp.GetStream().Close();
tcp.Close();
}
正确连接时:
if (!tcp.Connected) {
if (tcp.Client.Connected) tcp.GetStream().Close();
tcp.Close();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.