我正在使用一个名为xNet的请求系统,似乎发生了ObjectDisposedExceptions,其中发生的事件导致巨大的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中进行调试,但它几乎没有给我任何信息,历史调试只提供信息"未找到来源"。
调用Stack以获取上面屏幕截图中ObjectDisposedException的第一个异常抛出。
似乎与1430
中的行~Http/HttpRequest.cs
或217
中的行~Proxy/ProxyClient.cs
相关,因为它是我知道存在的唯一与之相关的行EndConnect套接字也巧合可以产生ObjectDisposedException。只是不确定如何正确处理异常,而不会导致脚本的其余部分失败。另外,为什么一个简单的例外导致CPU峰值过多?
奇怪的是,无论我如何为ObjectDisposedException包装异常处理程序,它都不会被触发,无论代码多少或我在哪里包装? (在两个脚本上)
try
{
tcpClient.EndConnect(ar);
}
catch (Exception ex)
{
connectException = ex;
}
答案 0 :(得分:0)
我发现原因,它不是因为.EndConnect对2个文件中的任何一个,它实际上是由.Close()调用引起的,因为它内部的.EndConnect,这就是为什么我看不到任何“来源“等。
所以它是因为套接字连接没有连接所致,所以做.Close()会导致异常。
这是一个简单的修复 (其中tcp =一个TcpClient)
执行以下操作而不仅仅是tcp.Close()
On Timeouts(如果从未连接过,最有可能的地方):
if (tcp.Client.Connected) {
tcp.GetStream().Close();
tcp.Close();
}
可能正确连接时:
if (!tcp.Connected) {
if (tcp.Client.Connected) tcp.GetStream().Close();
tcp.Close();
}