如何关闭嵌套在线程内的线程?
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 语句中你可以中止你的内线程
【讨论】:
以上是关于如何关闭嵌套在线程内的线程?的主要内容,如果未能解决你的问题,请参考以下文章