未处理 TCP 上的超时异常



我从一个网站上获取了这段代码,因为VS 2010不支持TCP连接的超时:

Private Function ConnectWithTimeout() As Boolean
    Dim ar As IAsyncResult = TCPClient.BeginConnect(IPAddress, TCPPort, Nothing, Nothing)
    Dim wh As System.Threading.WaitHandle = ar.AsyncWaitHandle
    Try
        If Not ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2), False) Then
            TCPClient.Close()
            TCPClient = New System.Net.Sockets.TcpClient
            Throw New TimeoutException()
        End If
    Catch ex As Exception
        ThrowError("Timeout on connecting to " & IPAddress & " at port " & TCPPort & ".")
        Return False
    Finally
        wh.Close()
    End Try
    Return True
End Function

工作正常,但每次,它都会在调试输出中给我这个:

"中发生了类型为'系统.超时异常'的第一次机会异常"

即使我抓住了所有的异常。有没有办法在处理时摆脱此异常消息?

我试过这个:

    Dim connectDone As New System.Threading.AutoResetEvent(False)
    TCPClient.BeginConnect(IPAddress, TCPPort, New AsyncCallback(Sub(ar As IAsyncResult)
                                                                     TCPClient.EndConnect(ar)
                                                                     connectDone.Set()
                                                                 End Sub), TCPClient)
    'client.BeginConnect("127.0.0.1", 80, new AsyncCallback(delegate( IAsyncResult ar ) { client.EndConnect( ar );  connectDone.Set(); }), client);
    If Not connectDone.WaitOne(2000) Then
        Debug.WriteLine("TIMEOUT")
        Return False
    End If
    Return True

但它在beginconnect行上给了我InvalidOperationException:当同一套接字上正在进行另一个异步操作时,无法调用 BeginConnect。

Private Function ConnectWithTimeout() As Boolean
    Dim ar As IAsyncResult 
    Dim wh As System.Threading.WaitHandle  
    Try
          ar = TCPClient.BeginConnect(IPAddress, TCPPort, Nothing, Nothing)
          wh = ar.AsyncWaitHandle
    Cath ex as Exception
          'Code to catch exception
    End Try
    Try
        If Not ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2), False) Then
            TCPClient.Close()
            TCPClient = New System.Net.Sockets.TcpClient
            Throw New TimeoutException()
    End If
    Catch ex As Exception
        ThrowError("Timeout on connecting to " & IPAddress & " at port " & TCPPort & ".")
        Return False
    Finally
        wh.Close()
    End Try
    Return True
End Function

最新更新