私はこのコードを持っています...
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
SpencerRuportからの回答を暗示するように変更しました。
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);
}
}