私はtcpListener.AcceptTcpClient()
独自のスレッド内で呼び出しています。これは永久にブロックされるため、フォームを閉じてもスレッドは終了しません。を呼び出してみlistenThread.Abort()
ましたが、スレッドが終了しません。くっついていAcceptTcpClient()
ます。
メインフォームを閉じたときにプログラム全体をシャットダウンするにはどうすればよいですか?
私はtcpListener.AcceptTcpClient()
独自のスレッド内で呼び出しています。これは永久にブロックされるため、フォームを閉じてもスレッドは終了しません。を呼び出してみlistenThread.Abort()
ましたが、スレッドが終了しません。くっついていAcceptTcpClient()
ます。
メインフォームを閉じたときにプログラム全体をシャットダウンするにはどうすればよいですか?
Thread.IsBackgroundThread
リスナー スレッドを開始する前に true に設定します。これにより、他のすべての (バックグラウンド以外の) スレッドが終了したときにプロセスを実行し続けることができなくなります。
@JohnKoernerがリンクした質問に対する受け入れられた回答に記載されているように、より良い(より複雑な場合)解決策は、非同期APIに切り替えることです。
2 つの別個の問題:
アプリの終了をブロックするスレッドを停止する方法 (他の回答で扱われます)
ブロックされた Socket メソッド呼び出しのブロックを解除する方法 (これにより、クライアントの受け入れを停止したいがアプリの実行を維持したい場合に、コードをもう少し再利用可能にすることができます)
スレッドが正常に終了できるようにするには、リスニング ソケットで Dispose を呼び出します。
tcpListener.Server.Dispose()
これにより、ブロックされたすべての操作が SocketException で失敗します。これをキャッチして対処し、スレッドを終了させます。