所以你读了标题,Thread.Abort() 什么时候不会真正中止?我听很多人说它是一个危险的命令,并且永远不能保证它会起作用,但我从来没有真正能够重现它。它一直对我有用..
是否有任何特定情况可能导致 Thread.Abort() 持续失败?
所以你读了标题,Thread.Abort() 什么时候不会真正中止?我听很多人说它是一个危险的命令,并且永远不能保证它会起作用,但我从来没有真正能够重现它。它一直对我有用..
是否有任何特定情况可能导致 Thread.Abort() 持续失败?
您甚至阅读过文档吗?
不保证线程立即中止,或者根本不中止。如果线程在作为 abort 过程的一部分调用的 finally 块中执行无限量的计算,则可能会发生这种情况,从而无限期地延迟 abort。要等到线程中止,您可以在调用 Abort 方法后在线程上调用 Join 方法,但不能保证等待会结束。
...
如果在尚未启动的线程上调用 Abort,则调用 Start 时线程将中止。如果在阻塞或休眠的线程上调用 Abort,则该线程将被中断然后中止。
如果在已挂起的线程上调用 Abort,则会在调用 Abort 的线程中引发 ThreadStateException,并将 AbortRequested 添加到正在中止的线程的 ThreadState 属性中。在调用 Resume 之前,不会在挂起的线程中引发 ThreadAbortException。
如果在执行非托管代码时在托管线程上调用 Abort,则在线程返回托管代码之前不会引发 ThreadAbortException。
如果两个 Abort 调用同时到来,一个调用设置状态信息而另一个调用执行 Abort 是可能的。但是,应用程序无法检测到这种情况。
在线程上调用 Abort 后,线程的状态包括 AbortRequested。在线程因成功调用 Abort 而终止后,线程的状态将更改为已停止。如果有足够的权限,作为 Abort 目标的线程可以使用 ResetAbort 方法取消中止。有关演示调用 ResetAbort 方法的示例,请参阅 ThreadAbortException 类。
还有一种情况是 Thread.Abort() 调用没有失败,但是线程没有终止。抛出的 ThreadAbortException 可以被线程本身捕获。如果确实如此,然后在 catch 处理程序中调用 Thread.ResetAbort(),则不会在 catch 块的末尾重新抛出 ThreadAbortException。