如何关闭嵌套在线程内的线程?

Posted

技术标签:

【中文标题】如何关闭嵌套在线程内的线程?【英文标题】:How to close a thread nested inside a thread? 【发布时间】:2013-02-08 20:23:27 【问题描述】:

我的代码中有一个线程嵌套在另一个线程中。在我的结束事件中,我使用upperThread.Abort() 来关闭上面的线程。但是,我的代码被挂断了。我相信这是因为我的lowerThread() 仍在运行。如何关闭较低(嵌套)线程以正确关闭应用程序?

【问题讨论】:

Thread.Abort()不安全,你不应该在新代码中使用它。 您的问题很难回答,因为您似乎对线程的工作方式有一些错误的看法。线程不会“嵌套”。工作线程和 UI 线程之间存在差异,但这种差异通常不表示为“嵌套”关系。更一般地说,cdhowie 是绝对正确的。如果您正在编写 thread.Abort,则几乎可以肯定您做错了什么。如果你需要关闭一个线程,那么想出一个信号机制,一个线程可以礼貌地关闭另一个线程。 Thread.Abort 让婴儿吉布斯哭泣。请使用Task @EricLippert 感谢您的提醒。这应该为我指明正确的方向。 当然一个线程启动另一个线程;还有什么会在用户代码中启动线程?但这并不能使“旧”线程以某种方式成为新线程的“所有者”。线程由它们的进程拥有,而不是由另一个线程拥有。您通过提出一种机制关闭两个线程,使进程中的所有线程礼貌地同意何时关闭;如果您正在编写具有多个线程的程序,那么您必须知道如何去做。 【参考方案1】:

不建议使用Thread.Abort(),但在极少数情况下仍可能需要。

这里是一个简单的例子:

var parent = new Thread(new ThreadStart(() =>

    Thread child = null;
    try
    
        child = new Thread(new ThreadStart(() =>
        
            // do stuff
        ));
        child.Start();
    
    catch (ThreadAbortException)
    
        if (child != null && child.IsAlive)
        
            // Abort child when parent is aborted
            child.Abort();
        
    
));
parent.Start();
parent.Abort();

在MSDN 上阅读有关 ThreadAbortException 的更多信息。

【讨论】:

【参考方案2】:

在面线里面你可以捕捉到ThreadAbortException。它在线程中止时抛出。然后在 catch 语句中你可以中止你的内线程

【讨论】:

以上是关于如何关闭嵌套在线程内的线程?的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的关闭线程池?

真正的并行处理[关闭]

如何优雅的关闭Java线程池

如何正确的关闭 MFC 线程

AfxBeginThread开启一个线程,怎样去关闭这个线程

关闭 QT GUI 后如何停止线程