У меня есть этот код...
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
Я изменил его, чтобы применить ответ от 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);
}
}