一个封锁操作被对WSACancelBlockingCall的调用中断

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的调用中断"

关不掉了.请碰到过此情况的高手指点.
在线.谢谢
答!: 1:
子线程在阻塞式监听, 主线程想stop. 是不是不行?
答!: 3:
楼主使用互斥锁试试
答!: 4:
我发现 s = this.listener.AcceptSocket(); 这句在server线程里.

server.Abort() 都没有用啊

调试要Terminate All时 才会正常退出,否则还是会死在server线程里的this.listener.AcceptSocket. Abort都没有用啊,怎么办?
答!: 5:
解决了

先判断tcpListener.Pending() 在阻塞. 没想到清华大学出的书也害人啊.

此贴就当散分贴吧

人人有分
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值