System.dll中的TCPClient.Close的ObjectDisposedException?

时间:2017-11-28 17:03:27

标签: c# exception

我正在使用一个名为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中进行调试,但它几乎没有给我任何信息,历史调试只提供信息"未找到来源"。

enter image description here

调用Stack以获取上面屏幕截图中ObjectDisposedException的第一个异常抛出。

enter image description here

似乎与1430中的行~Http/HttpRequest.cs217中的行~Proxy/ProxyClient.cs相关,因为它是我知道存在的唯一与之相关的行EndConnect套接字也巧合可以产生ObjectDisposedException。只是不确定如何正确处理异常,而不会导致脚本的其余部分失败。另外,为什么一个简单的例外导致CPU峰值过多?

奇怪的是,无论我如何为ObjectDisposedException包装异常处理程序,它都不会被触发,无论代码多少或我在哪里包装? (在两个脚本上)

try
{
    tcpClient.EndConnect(ar);
}
catch (Exception ex)
{
    connectException = ex;
}

1 个答案:

答案 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();
}