//我们一般是这样来接收一个客户端的
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,这是本人不想见到的,有什么办法避免这个异常?
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 的适用范围,上纲上线,因此触碰了基本的原则。