【问题标题】:How can I exit a background thread when the form closes?表单关闭时如何退出后台线程?
【发布时间】:2012-07-26 09:47:00
【问题描述】:

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

当我关闭主窗体时如何让我的整个程序关闭?

【问题讨论】:

标签: c#


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    两个独立的问题:

    1. 如何停止线程阻塞应用程序退出(在其他答案中处理)

    2. 如何解锁被阻塞的 Socket 方法调用(从而在您想要停止接受客户端但保持应用运行时让您的代码更具可重用性)

    要让线程优雅退出,可以在监听的socket上调用Dispose:

    tcpListener.Server.Dispose()
    

    这将导致所有被阻止的操作失败并出现 SocketException。抓住这个,处理它并让线程终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多