如何捕获ThreadAbort?

Sam*_*r83 1 c# multithreading exception-handling

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

处理threadAbort的正确方法是什么,因此它不会使我的应用程序崩溃.

Jar*_*Par 6

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

try {
  ...
} catch (ThreadAbortException) {
  Thread.ResetAbort();
}
Run Code Online (Sandbox Code Playgroud)

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