ThreadAbortException能否在finally块的空检查与Dispose()间触发?
ThreadAbortException会不会打断finally块里的空检查与Dispose调用?
你的判断完全正确——这种情况不可能发生。
在.NET的线程模型里,ThreadAbortException是个很特殊的异常,它的触发逻辑有个关键规则:当你调用Thread.Abort()触发这个异常时,CLR会延迟异常的抛出,直到当前正在执行的finally块完全执行完毕。
换句话说,一旦线程进入了finally块的执行流程,CLR会确保这个块里的所有代码都能完整跑完,不会在中间(比如你说的空检查之后、Dispose()调用之前)突然插入ThreadAbortException。哪怕finally块里有一堆代码,CLR也会等全部执行完,才会让ThreadAbortException继续传播(哪怕这个异常会自动重新抛出)。
举个更直观的例子:如果你的finally块里有三行代码,CLR绝不会在第一行和第二行之间、第二行和第三行之间触发ThreadAbortException,必须等三行都执行完,才会处理这个终止请求。
所以你完全不用担心里头的空检查和Dispose()调用被打断,finally块的执行完整性是CLR保证的。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

