一个有关Tcplistener的问题

.Net技术 码拜 8年前 (2016-05-04) 808次浏览
 //我们一般是这样来接收一个客户端的
Tcplistener.BeginAcceptTcpClient(new AsyncCallback(AcceptClientCallBack), Tcplistener);
//
void AcceptClientCallBack(IAsyncResult iar)
{
try
{
TcpListener listener = (TcpListener)iar.AsyncState;
//获得客户端;
this.Tcpclient = new MyTcpClient(listener.EndAcceptTcpClient(iar));
//
}
catch(ObjectDisposedException){}
catch(Exception ex)
{}
}
//
问题来了,本人在客户端没上线的时候,使用this.Tcplistener.Stop();  this.Tcplistener.Server.Dispose();  来结束网络端口的监听, 就会导致AcceptClientCallBack中,产生ObjectDisposedException,这是本人不想见到的,有什么办法避免这个异常?
解决方案

30

假如要比较准确地表达这里的逻辑,应该这样写

void AcceptClientCallBack(IAsyncResult iar)
        {
            TcpClient client = null;
            try
            {
                TcpListener listener = (TcpListener)iar.AsyncState;
                client = listener.EndAcceptTcpClient(iar);
            }
             catch(Exception ex)
             {
                   this.Tcpclient = null;
                   return;
             }
 
            this.Tcpclient = new MyTcpClient(client);
 
}

这样就能明白地说明你的逻辑了,别人也就不会误解你使用 try,,,catch 的本意了。
之所以误解,就是原因是你任意夸大了 try…catch 的适用范围,上纲上线,因此触碰了基本的原则。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个有关Tcplistener的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)