我有这段代码...
internal static void Start()
{
TcpListener listenerSocket = new TcpListener(IPAddress.Any, 32599);
listenerSocket.Start();
listenerSocket.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), null);
}
那么我的回调函数看起来像这样...
private static void AcceptClient(IAsyncResult asyncResult)
{
MessageHandler handler = new MessageHandler(listenerSocket.EndAcceptTcpClient(asyncResult));
ThreadPool.QueueUserWorkItem((object state) => handler.Process());
listenerSocket.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), null);
}
现在,我调用BeginAcceptTcpClient,然后过一段时间我想停止服务器。为了做到这一点,我一直在调用TcpListener.Stop()或TcpListener.Server.Close()。然而,两者都会执行我的AcceptClient函数。这时,当我调用EndAcceptTcpClient时,就会抛出异常。有什么最佳实践方法可以解决这个问题吗?我可以在调用stop后放置一个标志来停止AcceptClient的执行,但我想知道是否有什么我遗漏的东西。
更新1
目前,我已通过更改代码来修补它,使其看起来像这样。
private static void AcceptClient(IAsyncResult asyncResult)
{
if (!shutdown)
{
MessageHandler handler = new MessageHandler(listenerSocket.EndAcceptTcpClient(asyncResult));
ThreadPool.QueueUserWorkItem((object state) => handler.Process());
listenerSocket.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), null);
}
}
private static bool shutdown = false;
internal static void Stop()
{
shutdown = true;
listenerSocket.Stop();
}
更新 2
我改为实现 Spencer Ruport 的答案。
private static void AcceptClient(IAsyncResult asyncResult)
{
if (listenerSocket.Server.IsBound)
{
MessageHandler handler = new MessageHandler(listenerSocket.EndAcceptTcpClient(asyncResult));
ThreadPool.QueueUserWorkItem((object state) => handler.Process());
listenerSocket.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), null);
}
}