Thread.Abort() 什么时候不会真正中止
本文关键字:Abort 什么时候 Thread | 更新日期: 2023-09-27 17:55:57
所以你读了标题,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 块的末尾重新抛出。