什么时候Thread.Abort()实际上不会中止?

时间:2011-05-08 04:38:40

标签: c# multithreading abort

所以你看了标题,Thread.Abort()什么时候才能实际中止?我听说很多人说它是一个危险的命令,它永远不能保证工作,但我从来没有真正能够重现它。它总是对我有用..

是否有任何特定情况可能导致Thread.Abort()失败 一致

2 个答案:

答案 0 :(得分:9)

您是否阅读过the documentation

  

不保证线程立即中止,或根本不中止。如果线程在作为中止过程的一部分调用的finally块中执行无限量的计算,则会发生这种情况,从而无限期地延迟中止。要等到线程中止,可以在调用Abort方法后调用线程上的Join方法,但不能保证等待将结束。

     

...

     

如果在尚未启动的线程上调用Abort,则在调用Start时线程将中止。如果在被阻塞或正在休眠的线程上调用Abort,则线程被中断然后中止。

     

如果在已挂起的线程上调用Abort,则在调用Abort的线程中抛出ThreadStateException,并将AbortRequested添加到正在中止的线程的ThreadState属性中。在调用Resume之前,不会在挂起的线程中抛出ThreadAbortException。

     

如果在执行非托管代码时在托管线程上调用Abort,则在线程返回托管代码之前不会抛出ThreadAbortException。

     

如果两次同时调用Abort,则一次调用可以设置状态信息,另一次调用可以执行Abort。但是,应用程序无法检测到这种情况。

     

在线程上调用Abort后,线程的状态包括AbortRequested。由于成功调用Abort导致线程终止后,线程的状态将更改为Stopped。 如果具有足够的权限,则作为Abort目标的线程可以使用ResetAbort方法取消中止。有关演示调用ResetAbort方法的示例,请参阅ThreadAbortException类。

答案 1 :(得分:-1)

在某些情况下,Thread.Abort()调用不会失败,但是线程不会终止。线程本身可以捕获抛出的ThreadAbortException。如果这样做,然后在catch处理程序中调用Thread.ResetAbort(),则不会在catch块的末尾抛出ThreadAbortException。