2011-08-31 80 views
1

我有一个函数,我调用thread.abort杀死一个线程。我知道这不是最好的做法,但我正在调用一个基本上在该函数中有无限循环的dll函数,所以我可以终止该线程的唯一方法是调用线程终止。我可以调用一个thread.join,但是我的gui会卡住。我在表单应用程序和该线程中都做了一个捕获,但是当我调用thread.abort函数时,引发了一个异常,它被我的try块在其中一个地方捕获,但是我的应用程序仍然崩溃。如何捕捉ThreadAbort?

什么是正确的方式来处理一个threadAbort,所以它不会使我的应用程序崩溃。

+0

你的应用程序如何崩溃?抛出这个其他异常的堆栈跟踪是什么?这是另一个DLL管理或不管理(是的,它很重要,实际上是至关重要的信息)? –

回答

6

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

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

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

1

不要使用Thread.Abort(),指示线程停止。喜欢的东西

private volatile _keepRunning = true; 

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

public void Abort() 
{ 
    _keepRunning = false; 
} 

,您可以得到更多的花哨ManualResetEvent s到信号末端更快,仍然使用加入,但基本概念是存在的。我经常在我们的应用中使用它,它运行良好。