C# 当窗体关闭时,如何退出后台线程?

C# 当窗体关闭时,如何退出后台线程?,c#,C#,我正在自己的线程内调用tcpListener.AcceptTcpClient()。因为这会永远阻塞,所以当窗体关闭时线程不会退出。我尝试调用listenThread.Abort(),但线程没有退出。它卡在AcceptCpcClient()上 如何在关闭主窗体时关闭整个程序?在启动侦听器线程之前,将Thread.IsBackgroundThread设置为true。这将阻止它在所有其他(非后台)线程退出时保持进程运行 一个可能更好(如果更复杂)的解决方案是切换到异步API,正如@JohnKoerne

我正在自己的线程内调用
tcpListener.AcceptTcpClient()
。因为这会永远阻塞,所以当窗体关闭时线程不会退出。我尝试调用
listenThread.Abort()
,但线程没有退出。它卡在
AcceptCpcClient()


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

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

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

两个独立的问题:

  • 如何停止线程阻塞应用程序退出(在其他答案中讨论)

  • 如何取消阻止被阻止的套接字方法调用(从而使您的代码在需要停止接受客户端但保持应用程序运行时更易于重用)

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

    tcpListener.Server.Dispose()
    
    这将导致所有被阻止的操作因SocketException而失败。捕捉这个,处理它并允许线程终止。

    我认为listenThread.Interrupt()可能重复;更安全