假设我们有一些类似的代码在单独的线程中运行:
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/