使用Thread.Abort()有什么问题
所以我知道你不应该使用
Thread.Abort()
但我从来没有得到一个很好的解释。 是否有性能损失或一些隐藏的陷阱?
我知道你不能忽略/吞下ThreadAbortException(这是有道理的)
除了这里的所有其他好的答案之外,让我补充一点,对Thread.Abort的调用实际上将中止所讨论的线程并不能保证。 有可能(虽然不是特别容易)“硬化”一个线程以防被中止。 例如,如果你因为认为它正在运行敌对代码而中止了一个线程,那么敌对代码就可能抵抗它自己的破坏。
如果你有一个长期运行的操作涉及你不拥有的必须清理干净的代码,那么正确的方法是把代码放在它自己的进程中 ,而不是自己的线程中。 (最好是在这个过程中受到高度安全限制的应用程序域中)。然后,您可以干净地终止进程。
总之,Thread.Abort充其量表示devise不好,可能不可靠,而且非常危险。 应该不惜一切代价避免; 唯一的时候你甚至应该考虑中止一个线程是在某种“紧急closures”代码,你试图拆除一个应用程序尽可能干净。
因为如果你知道线程处于可以被中止的安全状态,那么你可以安排更好的通信并且让线程干净地退出。
线程可能已经locking,正在改变一些共享状态,Thread.Abort将撤消locking并使共享状态损坏。
伤害自己比较容易 正如其他人所说的那样,它会在代码中引发一个例外,在任何时候都可能发生。 这可能是好的,如果你期望这一点,并已编码的方式,优雅地处理这个例外在任何时候,但有些人不:
Monitor.Enter(obj); // some code - if exception is raised here, then the lock isn't released Monitor.Exit(obj) IDisposable someCriticalResource = GetResource(); // some code - if exception is raised here, then the object isn't disposed someCriticalResource.Dispose();
此外,如果您与团队中的许多人一起工作,除非您有良好的代码审查,否则不能保证您将使用的代码的质量。 因此,鼓吹“不使用Thread.Abort()”是一个好主意,而不是让人们记住编写对代码中任何地方出现的exception有效的代码。
简而言之。 任何IDisposable对象可能不会被丢弃。 任何locking的对象都可能未被解锁。 任何必须100%执行的东西永远不会完成。
当在另一个线程上调用Thread.Abort()时,ThreadAbortException被注入到该线程的stream中。 如果你幸运的话,代码将处理得很好,然后以一个明确的状态中止。 问题是你没有办法弄清楚你是否在每一种情况下都是幸运的,所以如果你更喜欢安全而不是在其他线程上调用Thread.Abort不是一个好主意。
Thread.Abort以不受控制的方式停止线程。 线程.Abort会抛出一个exception,这将导致你的线程立即停止。
什么是错误的:在大多数情况下,你要优雅地停止你正在执行的操作。 例如,如果正在执行ACID操作,则可能需要在结束该线程之前完成当前操作,以便系统保持稳定状态。
Thread.Abort在目标线程中产生exception。 在此期间,目标线程可能会执行一些关键操作,并且exception升级可能会破坏您的应用程序状态。