http://csharp.365dev.net/WSACancelBlockingCall-3157.html
一个封锁操作被对WSACancelBlockingCall的调用中断(在线)
问?:
可以接受多个client. 现在连接正常,可以使用,就是Close();时有问题.
部分代码如下:
public QTCPServer(int port, ExecuteCommand executeCommand) //构造函数,启用监听线程
{
this.sessions = new ArrayList ();
this.sessionThreads = new ArrayList ();
this.executeCommand = executeCommand;
this.open = true;
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, port);
this.listener = new TcpListener(ipLocalEndPoint);
this.listener.Start ();
this.server = new Thread ( new ThreadStart ( Run ) );//用来监听的线程;
this.server.Start ();
}
public void Run ()
{
while ( this.open )
{
Socket s=null;
s = this.listener.AcceptSocket();
if (s.Connected)
{
QTCPServerSession session = new QTCPServerSession(s,this.executeCommand);
this.sessions.Add(session);
Thread th = new Thread(new ThreadStart(session.Run)); //在开线程,处理相关事宜.
th.Start();
this.sessionThreads.Add(th);
}
}
}
public void Close ()
{
if ( this.open )
{
this.open = false;
this.listener.Stop();
this.server.Abort ();
this.server.Join();
while (this.sessions.Count > 0)
{
Thread th = (Thread)this.sessionThreads[0];
th.Abort();
th.Join ();
this.sessionThreads.Remove(th);
QTCPServerSession s = (QTCPServerSession)this.sessions[0];
s.Close();
this.sessions.Remove(s);
}
}
}
Close()时,执行到this.server.Abort ();关闭线程时, Run()中的s = this.listener.AcceptSocket();就会报错 "一个封锁操作被对WSACancelBlockingCall的调用中断"
关不掉了.请碰到过此情况的高手指点.
在线.谢谢
部分代码如下:
public QTCPServer(int port, ExecuteCommand executeCommand) //构造函数,启用监听线程
{
this.sessions = new ArrayList ();
this.sessionThreads = new ArrayList ();
this.executeCommand = executeCommand;
this.open = true;
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, port);
this.listener = new TcpListener(ipLocalEndPoint);
this.listener.Start ();
this.server = new Thread ( new ThreadStart ( Run ) );//用来监听的线程;
this.server.Start ();
}
public void Run ()
{
while ( this.open )
{
Socket s=null;
s = this.listener.AcceptSocket();
if (s.Connected)
{
QTCPServerSession session = new QTCPServerSession(s,this.executeCommand);
this.sessions.Add(session);
Thread th = new Thread(new ThreadStart(session.Run)); //在开线程,处理相关事宜.
th.Start();
this.sessionThreads.Add(th);
}
}
}
public void Close ()
{
if ( this.open )
{
this.open = false;
this.listener.Stop();
this.server.Abort ();
this.server.Join();
while (this.sessions.Count > 0)
{
Thread th = (Thread)this.sessionThreads[0];
th.Abort();
th.Join ();
this.sessionThreads.Remove(th);
QTCPServerSession s = (QTCPServerSession)this.sessions[0];
s.Close();
this.sessions.Remove(s);
}
}
}
Close()时,执行到this.server.Abort ();关闭线程时, Run()中的s = this.listener.AcceptSocket();就会报错 "一个封锁操作被对WSACancelBlockingCall的调用中断"
关不掉了.请碰到过此情况的高手指点.
在线.谢谢
答!:
1:
子线程在阻塞式监听, 主线程想stop. 是不是不行?
答!:
3:
楼主使用互斥锁试试
答!:
4:
我发现 s = this.listener.AcceptSocket(); 这句在server线程里.
server.Abort() 都没有用啊
调试要Terminate All时 才会正常退出,否则还是会死在server线程里的this.listener.AcceptSocket. Abort都没有用啊,怎么办?
server.Abort() 都没有用啊
调试要Terminate All时 才会正常退出,否则还是会死在server线程里的this.listener.AcceptSocket. Abort都没有用啊,怎么办?
答!:
5:
解决了
先判断tcpListener.Pending() 在阻塞. 没想到清华大学出的书也害人啊.
此贴就当散分贴吧
人人有分
先判断tcpListener.Pending() 在阻塞. 没想到清华大学出的书也害人啊.
此贴就当散分贴吧
人人有分