繁体   English   中英

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

[英]How can I exit a background thread when the form closes?

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

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

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

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

两个独立的问题:

  1. 如何停止阻止应用退出的线程(与其他答案打交道)

  2. 如何取消阻止已阻塞的Socket方法调用(从而使您的代码在希望停止接受客户端但保持应用程序运行时更加可重用)

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

tcpListener.Server.Dispose()

这将导致所有被阻止的操作均因SocketException而失败。 赶上,处理并允许线程终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM