2013-08-20 59 views
0

MSDN说,对于Thread.Abort方法 -C# - ThreadAbortException重新抛出

当此方法是在一个线程调用,系统抛出线程一个ThreadAbortException中止它。 ThreadAbortException是一个特殊的异常,可以被应用程序代码捕获,但在catch块的末尾被重新抛出,除非调用ResetAbort。 ResetAbort取消中止请求,并阻止ThreadAbortException终止线程。在线程被中止之前,最终未执行的块将被执行。

因此,从最直接的catch块或从所有封装catch块只会抛出一次异常? 另外,当说未执行的finally块被执行时,它是否包含完全未执行的块和部分执行的块?

+2

你为什么不写一段代码试试? – Ehsan

回答

2

如果finally块正在执行并且它们需要在回滚堆栈期间需要执行,则它们始终受到完全保护,不受ThreadAbortException的影响。

是的,很显然ThreadAbortException将自动在任何try... catch块的末尾在同一个拦截它的线程中重新提升,否则它将毫无意义。只有两个“生命”才能有什么用处?ThreadAbortException

这是合乎逻辑的,这可以阻止ThreadAbortException

try 
{ 
    try 
    { 
     // The Thread.Abort "happens" here 
     Thread.Sleep(Timeout.Infinite); 
    } 
    catch 
    { 
    } 
} 
catch 
{ 
} 

虽然这不会?

try 
{ 
    // The Thread.Abort "happens" here 
    Thread.Sleep(Timeout.Infinite); 
} 
catch 
{ 
} 
+0

非常感谢! – Cygnus