当前位置: 首页 > 编程语言 > C#

TcpClientBeginConnect后,应用程序在退出时挂起20秒分享

时间:2023-04-11 00:29:29 C#

TcpClientBeginConnect后,应用程序在退出时挂起20秒,行为异常。我使用BeginConnect()向Connect()方法添加超时(请参阅下面的扩展方法代码)。如果我连接,我调用EndConnect()并且一切正常,但如果我超时我不能调用EndConnect()因为它阻塞了大约20秒,所以我只调用这个非阻塞代码:result.AsyncWaitHandle.Close();结果.AsyncWaitHandle.Dispose();客户端.Close();问题是当我在超时后(运行代码后)关闭表单时,我的应用程序将“挂起”大约20秒。有什么办法可以阻止这种挂起吗?当应用程序退出时,这只是令人不快,所以,如果没有别的可能,它可能是一些肮脏的杀戮;]一些注意事项:这是我的连接代码:publicboolConnect(stringlocalMachineName){//获取本地机器的ipsIPAddress[]知识产权局;尝试{ips=Dns.GetHostEntry(localMachineName).AddressList.Where(o=>o.AddressFamily==AddressFamily.InterNetwork).ToArray();}赶上{返回假;}//循环并尝试连接foreach(IPAddressipinips){TcpClientc=newTcpClient();尝试{c.NoDelay=true;c.发送超时=1000;//这似乎没有改变任何东西c.ReceiveTimeout=1000;//这似乎没有改变任何东西//使用超时调用连接-扩展方法//这在1秒后离开(根据需要)但在退出时挂起应用程序c.Connect(ip,8888,newTimeSpan(0,0,1));//如果你评论前一行并取消注释下面的代码行//它会阻塞大约20秒并且不会挂在应用程序退出//c.Connect(ip,8888);如果(c.Connected){MyClient=c;休息;}else{我的客户=null;}}catch{c.Close();我的客户=空;}}return(MyClient!=null)&&(MyClient.Connected);}上面的代码是使用扩展方法连接超时,这种方法的代码如下(基于某些SO代码的代码):publicstaticvoidConnect(thisTcpClientclient,IPAddressip,intport,TimeSpantimeout){//开始异步连接IAsyncResultresult=client.BeginConnect(ip,port,null,null);如果(result.CompletedSynchronously){client.EndConnect(result);返回;}try{//等到连接或超时或应用程序关闭WaitHandle[]handles=newWaitHandle[]{result.AsyncWaitHandle,shutdownEvent};intindex=WaitHandle.WaitAny(handles,timeout);if(index==0){//已连接client.EndConnect(result);}elseif((index==1)||(index==WaitHandle.WaitTimeout)){//超时或应用程序关闭/**启用此功能将在EndConnect上阻塞约15-20秒client.EndConnect(result);客户端.Close();返回;*//**或者,在上面的评论之后我尝试了这段代码,*它没有阻塞,但是它挂起大约2应用程序退出时0秒client.Client.Close();客户端.Client.Dispose();*///这不会阻塞,但随后它会在应用程序退出时挂起大约20秒result.AsyncWaitHandle.Close();结果.AsyncWaitHandle.Dispose();客户端.Close();}}catch(Exceptione){client.Close();thrownewException("连接超时错误:"+e.Message);我在这个问题上搜索了很多内容,但看不到与这个特定问题相关的任何内容请帮忙!以上是C#学习教程:TcpClientBeginConnect后,应用退出时挂了20秒。分享的所有内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: