如何检查我是否已连接?ALL,我正在编写一个需要异步阻塞连接到服务器的应用程序。我有一个带有按钮的GUI窗体和一个执行与BeginConnect/EndConnect对的连接的类。实现遵循此MSDN示例。但是,回调方法中抛出异常。这就是我要避免的。我想要的是检查是否建立了连接,如果建立了,它会在GUI表单上以文本形式吐出适当的错误。我试图检查BeginConnect()的返回值,但它在调用静态方法之前返回。我尝试重新抛出异常并在建立连接时捕获它(按钮单击事件),但它不起作用。未捕获异常。如何检查连接是否建立?我可以将我的文本控件传递给连接类,并在捕获到异常时将文本设置为错误,但是还有另一种方法吗?谢谢。[编辑]classInternetConnector{publicvoidConnectToHost(){IPEndPointip=newIPEndPoint(IPAddress.Parse(connector_host),connector_port);client=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);client.Blocking=true;client.BeginConnect(ip,newAsyncCallback(ConnectCallback),client);}privatestaticvoidConnectCallback(IAsyncResultar){try{Socketsock=(Socket)ar.AsyncState;sock.EndConnect(ar);connectDone.Set();已连接=真;}catch(异常e){抛出(e);}}}publicpartialclassForm1:Form{privateboolisRunning=false;私有InternetConnector客户端=newInternetConnector();privatevoidstartStop_Click(objectsender,EventArgse){try{if(!isRunning||!InternetConnector.Connected){if(!InternetConnector.Connected){client.SetAddress(ipAddress.Text);client.SetPort(Convert.ToInt32(connectionport.Text));客户端.ConnectToHost();status.Text="信号接收器:已连接";status.ForeColor=Color.Green;startStop.Text="停止";正在运行=真;}else{startStop.Text="开始";客户端.DisconnectFromHost();isRunning=false;}}}catch(Exceptionex){status.Text="SocketError:"+ex.Message;}}}如果我使用“throw(e);”在callbackcatch块中,clicklistener没有捕获异常,但在callback中需要try/catch,因为错误的连接会抛出异常并且不会返回错误。因为您使用的是异步BeginConnect,所以回调几乎永远不会发生在与点击处理程序相同的线程上,因此您的点击处理程序无法捕获异常。如果需要通过异步回调设置UI元素的状态,通常需要在创建UI的同一线程上执行委托。从Control派生的任何UI元素都有一些方法可以帮助您执行此操作(InvokeRequired和BeginInvoke)。我修改了您的示例以帮助说明这一点。基本上,您可以传入一个Action委托,如果它发生在异步连接回调中,它将被调用并出现异常。然后,此错误处理委托可以完成所有工作,根据异步连接回调期间抛出的异常来设置UI状态。因为我们需要传递错误处理委托,所以我们必须创建一个结构(称为ConnectionData)来保存我们需要在异步连接回调中访问的所有状态(套接字和错误处理程序)。类InternetConnector{privatestructConnectionData{publicActionErrorHandler{get;放;}公共套接字套接字{得到;放;}}publicvoidConnectToHost(ActionerrorHandler){IPEndPointip=newIPEndPoint(IPAddress.Parse(connector_host),connector_port);client=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);varconnectionData=newConnectionData{ErrorHandler=errorHandler,Socket=client};client.Blocking=true;client.BeginConnect(ip,newAsyncCallback(ConnectCallback),connectionData);}privatestaticvoidConnectCallback(IAsyncResultar){ConnectionDataconnectionData=newConnectionData();尝试{connectionData=(ConnectionData)ar.AsyncState;connectionData.Socket.EndConnect(ar);connectDone.Set();已连接=真;}catch(Exceptione){if(connectionData.ErrorHandler!=null)connectionData.ErrorHandler(e);}}}publicpartialclassForm1:Form{privateboolisRunning=false;私人吃了InternetConnector客户端=newInternetConnector();privatevoidAsyncErrorHandler(Exceptione){if(status.InvokeRequired){//在控件的UI线程上排队调用我们自己并立即返回status.BeginInvoke(newAction(()=>AsyncErrorHandler(e)));返回;}//我们在正确的线程上设置状态文本status.Text="AsyncError:"+ex.Message;}privatevoidstartStop_Click(objectsender,EventArgse){try{if(!isRunning||!InternetConnector.Connected){if(!InternetConnector.Connected){client.SetAddress(ipAddress.Text);client.SetPort(Convert.ToInt32(connectionport.Text));//连接,传入报错方法client.ConnectToHost(AsyncErrorHandler);status.Text="信号接收器:已连接";status.ForeColor=Color.Green;startStop.Text="停止";正在运行=真;}else{startStop.Text="开始";客户端.DisconnectFromHost();isRunning=false;}}}catch(Exceptionex){status.Text="袜子etError:"+ex.Message;}}}在Windows中有属性Socket.ConnectedReturnValue如果没有发生错误,connect返回零。否则返回SOCKET_ERROR,具体的错误码可以通过调用WSAGetLastError获取。以上是C#学习教程:如何检查我是否连接?全部内容分享,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。这篇文章是收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
