我有这个代码...
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。 什么是解决这个最佳做法呢? 我只是把一个标志以阻止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
我改成了impliment从斯宾塞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);
}
}