刚用Socket不久,发现当服务器那边那关闭时,我的程序窗体就卡住了.
用了一个Timer控件,以每30秒就发送一次信息进行
如果服务器那边没有关闭和出现异常,程序非常正常
关闭或出异常时,就卡住了Timer的时间间隔30S
是Timer在计时而卡住了还是Socket的问题.
还请各位高手教我方法解决这个问题!
用了一个Timer控件,以每30秒就发送一次信息进行
如果服务器那边没有关闭和出现异常,程序非常正常
关闭或出异常时,就卡住了Timer的时间间隔30S
是Timer在计时而卡住了还是Socket的问题.
还请各位高手教我方法解决这个问题!
Timer的计时没有停止,但窗体都完成卡住了。当计时计到30S时还会再发送数据,也就在发送数据后,窗体就不被卡住了
把socket的操作写在子线程里,可以解决你的问题。
public void ReceiveSocket()
{
while (true)
{
....
try
{ MsgLen = CMSocket.Receive(PKHead, Marshal.SizeOf(PK_Head), SocketFlags.None);//阻塞接收,返回接收数据长度
}
catch //(Exception e)
{
break;
}
....
}
}
上面就是子线程里面的代码片断
如何让他不卡呢?
但是当服务器关闭时,这时进行测试,就开始卡了,卡的总时间是我每次测试的间隔时间
程序窗体完全不能操作的那种卡。
如何才能让Socket知道服务器已经断开了?
{
while (true)
{
....
try
{ MsgLen = CMSocket.Receive(PKHead, Marshal.SizeOf(PK_Head), SocketFlags.None);//阻塞接收,返回接收数据长度
}
catch //(Exception e)
{
break;
}
....
}
} ----------------
你给出的代码中可能在逻辑上有点问题,当服务器关闭的时候MsgLen 可能返回的是0而不会抛出错误,但因为你的代码里没有处理这个情况,可能程序一直在进行死循环了.你可以试着加一个判断,比如:if( MsgLen ==0)
{
return;
}
谢谢您
我知道我错在哪里了!
没有收到信息时MsgLen是没有数值的,当服务器关闭或异常时,MsgLen的值是为0.
以前总是以为没有收到信息时MsgLen的值是为0的.现在明白自己错了
代码更改后如下
public void ReceiveSocket()
{
while (true)
{
....
try
{ MsgLen = CMSocket.Receive(PKHead, Marshal.SizeOf(PK_Head), SocketFlags.None);//阻塞接收,返回接收数据长度
}
catch //(Exception e)
{
break;
}
if(MsgLen!=0)
{
....
}
else
{
....
}
}
}