我tcpListener.AcceptTcpClient()
在它自己的线程中调用。因为这会永远阻塞,所以当我的表单关闭时线程不会退出。我尝试调用listenThread.Abort()
,但线程没有退出。它卡在AcceptTcpClient()
.
当我关闭主窗体时,如何让我的整个程序关闭?
我tcpListener.AcceptTcpClient()
在它自己的线程中调用。因为这会永远阻塞,所以当我的表单关闭时线程不会退出。我尝试调用listenThread.Abort()
,但线程没有退出。它卡在AcceptTcpClient()
.
当我关闭主窗体时,如何让我的整个程序关闭?
Thread.IsBackgroundThread
在启动侦听器线程之前设置为 true。这将阻止它在所有其他(非后台)线程退出时保持进程运行。
一个可能更好(如果更复杂)的解决方案是切换到异步 API,如@JohnKoerner 链接的问题的公认答案中所述。
两个单独的问题:
如何停止线程阻塞应用程序退出(在其他答案中处理)
如何解除阻塞的 Socket 方法调用(从而在您想要停止接受客户端但保持应用程序运行时使您的代码更具可重用性)
要让线程优雅地退出,您可以在侦听套接字上调用 Dispose:
tcpListener.Server.Dispose()
这将导致所有被阻止的操作失败并出现 SocketException。抓住这个,处理它并让线程终止。