Thread.Abort() 什么时候不会真正中止

本文关键字:Abort 什么时候 Thread | 更新日期: 2023-09-27 17:55:57

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

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

Thread.Abort() 什么时候不会真正中止

你甚至读过文档吗?

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

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

如果在已挂起的线程上调用 Abort,则会在名为 Abort 的线程中引发 ThreadStateException,并将 AbortRequest 添加到要中止的线程的 ThreadState 属性中。在调用 Resume 之前,不会在挂起的线程中引发 ThreadAbortException。

如果在托管线程

执行非托管代码时在托管线程上调用 Abort,则在线程返回到托管代码之前不会引发 ThreadAbortException。

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

在线程上调用 Abort 后,线程的状态包括 AbortRequest。线程因成功调用 Abort 而终止后,线程的状态将更改为"已停止"。如果有足够的权限,作为中止目标的线程可以使用 ResetAbort 方法取消中止。有关演示如何调用 ResetAbort 方法的示例,请参阅 ThreadAbortException 类。

还有一种情况是 Thread.Abort() 调用不会失败,但线程不会终止。 引发的 ThreadAbortException 可以由线程本身捕获。 如果是这样,然后在 catch 处理程序中调用 Thread.ResetAbort(),则 ThreadAbortException 将不会在 catch 块的末尾重新抛出。