如何控制C#Socket的连接超时时间
2013-12-17 16:24
246 查看
最近在Socket编程的时候发现只能设置Send和Recieve的Timeout时间,而Connect方法的Timeout是固定的,大概有30-40s,如果用同步方法界面会卡死很长时间
下面介绍两种通过异步的方式解决此问题的方法:
1.使用BeginConnect方法
IAsyncResult connResult = mySocket.BeginConnect(yourAddress, yourPort, null, null);
connResult.AsyncWaitHandle.WaitOne(2000, true); //等待2秒
if (!connResult.IsCompleted)
{
mySocket.Close();
//处理连接不成功的动作
}
else
{
//处理连接成功的动作
}
这种方法很好的控制了连接超时时间而且代码非常简单,但是界面仍然会有2秒的卡死产生。如果想解决该问题,则需要创建一个额外的线程来执行WaitOne方法。
2.使用ConnectAsync方法
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += new EventHandler<SocketAsyncEventArgs>(AsyncConnected);
e.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(yourAddress), yourPort);
mySocket.ConnectAsync(e);
这是一种事件触发的方式,将连接成功后的动作放在Completed事件的处理过程中,从而使界面不会卡死。同时也可以创建一个额外线程来监视连接时间,从而达到控制连接超时的目的。
下面介绍两种通过异步的方式解决此问题的方法:
1.使用BeginConnect方法
IAsyncResult connResult = mySocket.BeginConnect(yourAddress, yourPort, null, null);
connResult.AsyncWaitHandle.WaitOne(2000, true); //等待2秒
if (!connResult.IsCompleted)
{
mySocket.Close();
//处理连接不成功的动作
}
else
{
//处理连接成功的动作
}
这种方法很好的控制了连接超时时间而且代码非常简单,但是界面仍然会有2秒的卡死产生。如果想解决该问题,则需要创建一个额外的线程来执行WaitOne方法。
2.使用ConnectAsync方法
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += new EventHandler<SocketAsyncEventArgs>(AsyncConnected);
e.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(yourAddress), yourPort);
mySocket.ConnectAsync(e);
这是一种事件触发的方式,将连接成功后的动作放在Completed事件的处理过程中,从而使界面不会卡死。同时也可以创建一个额外线程来监视连接时间,从而达到控制连接超时的目的。
相关文章推荐
- C#如何控制方法的执行时间,超时则强制退出方法执行
- C#如何控制方法的执行时间,超时则强制退出方法执行
- c#左右socket连接超时控制方案
- C# 给某个方法设定执行超时时间 C#如何控制方法的执行时间,超时则强制退出方法执行 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)
- c#关于socket连接超时控制的方案
- 阻塞模式下socket连接connect超时后长达75秒,如何避免
- C# Socket连接请求超时机制
- C#如何控制方法的执行时间,超时则强制退出方法执行
- c# socket连接请求超时设置
- C# Socket连接请求超时机制
- Socket中如何设置连接超时
- 如何解决 Socket 连接超时
- 使用ffmpeg的av_read_frame,如何控制连接超时
- Socket中如何设置连接超时
- C# Socket连接请求超时机制
- Socket中如何设置连接超时(转)
- Socket中如何设置连接超时
- C#中设置Socket连接请求的超时
- java socketTimeOut, jdbc timeout 连接超时时间
- C# Socket连接请求超时机制