表单关闭时如何退出后台线程?

时间:2012-07-27 17:10:24

标签: c#

我在自己的线程中调用tcpListener.AcceptTcpClient()。因为这会永远阻塞,所以当我的表单关闭时,线程不会退出。我试着调用listenThread.Abort(),但线程没有退出。它停留在AcceptTcpClient()

关闭主窗体时,如何让整个程序关闭?

2 个答案:

答案 0 :(得分:5)

在启动侦听器线程之前将Thread.IsBackgroundThread设置为true。这将阻止它在所有其他(非后台)线程退出时保持进程运行。

可能更好(如果更复杂)的解决方案是切换到异步API,如@JohnKoerner链接的问题的接受答案中所述。

答案 1 :(得分:2)

两个不同的问题:

  1. 如何阻止线程阻止app退出(在其他答案中处理)

  2. 如何解除阻止的Socket方法调用(从而在您面临想要停止接受客户端但保持应用程序运行时使代码更可重用)

  3. 要允许线程正常退出,可以在侦听套接字上调用Dispose:

    tcpListener.Server.Dispose()
    

    将导致所有阻塞的操作因SocketException而失败。抓住它,处理它并允许线程终止。