如何捕获ThreadAbort?

时间:2011-08-31 00:16:50

标签: c# multithreading exception-handling

我有一个函数,我调用thread.abort来杀死一个线程。我知道这不是最好的做法,但我在一个dll中调用一个函数,它在该函数中基本上有一个无限循环,所以我终止该线程的唯一方法就是调用一个线程中止。我可以调用一个thread.join,然后我的gui会卡住。我已经在我的表单应用程序和该线程中完成了一个catch,但是当我调用thread.abort函数时抛出一个异常,它被其中一个地方的try块捕获,但我的应用程序仍然崩溃。

处理threadAbort的正确方法是什么,这样就不会使我的应用程序崩溃。

2 个答案:

答案 0 :(得分:6)

您的应用程序崩溃了,因为ThreadAbortException会在处理它的任何catch块的末尾自动重新抛出。为了防止它被重新引发,您需要致电Thread.ResetAbort()

try {
  ...
} catch (ThreadAbortException) {
  Thread.ResetAbort();
}

注意:我建议你找另一种方法摆脱这种方法。中止线程是非常危险的,应该只是最后的手段。将取消令牌传递给线程或使用共享标志退出无限循环会更安全。

答案 1 :(得分:1)

不要使用Thread.Abort(),表示线程停止。像

这样的东西
private volatile _keepRunning = true;

public void DoWork()
{
    while(_keepRunning)
    {
    }
}

public void Abort()
{
    _keepRunning = false;
}

你可以使用ManualResetEvent来更快地表达结尾并仍然使用联接,但基本概念就在那里。我经常在我们的应用程序中使用它,它运行良好。