假设我们有一些类似的代码在单独的线程中运行:

private static void ThreadFunc() {
    ulong counter = 0;

    while (true) {

        try {
            Console.WriteLine( "{0}", counter++ );
        }
        catch (ThreadAbortException) {
            Console.WriteLine( "Abort!" );
        }

    }
}

调用Thread.Abort()时,是否有可能将异常引发到catch块之外?

最佳答案

确实可以, ThreadAbortException 很特殊。即使您处理了它,它也会在try/catch/finally之后由CLR自动重新抛出。 (如注释中所述,可以用 ResetAbort 抑制它,但是到那时,代码闻起来像烂鱼。)

即使在try/catch/finally之外没有明显的可执行代码,更不用说,循环的每次迭代都会在作用域外停留一小段时间,因此中止可能发生在try块之外。

除非您实际上在catch块中正在执行某项操作,否则我将进行一次尝试/最后尝试,并且不必担心ThreadAbortException。有很多更好的方法可以在不使用Thread.Abort的情况下中止线程,这不仅会在无法预测的点困惑地中断您的代码,而且还不能保证正常工作,因为如果您的线程当前正在调用某些非托管代码,则该线程在控制之前不会中止返回托管代码。

最好使用某种类型的同步原语(例如 ManualResetEvent )作为标记来告知线程何时退出。您甚至可以为此使用一个 bool 字段,这是BackgroundWorker所做的。

关于c# - ThreadAbortException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1856286/

10-09 01:59