所以我知道你不应该使用
Thread.Abort()
但我从未得到过很好的解释。是否存在性能损失或隐藏的问题?
我知道你不能忽略/吞下ThreadAbortException(这是有意义的)
答案 0 :(得分:78)
除了这里所有其他好的答案之外,让我补充说,无法保证对Thread.Abort的调用实际上会中止有问题的线程。有可能(虽然不是特别容易)“强化”线程以防止被中止。例如,如果您因为认为它运行恶意代码而中止线程,则恶意代码可能会抵制其自身的破坏。
如果你有一个长期运行的操作涉及你不拥有的代码必须干净地删除,那么正确的方法是将代码放在它自己的进程中,而不是它自己的线程。 (最好是在该过程中受到高度安全性限制的应用程序域。)然后,您可以彻底杀死该进程。
简而言之,Thread.Abort充其量只是表明设计不良,可能不可靠,而且非常危险。应该不惜一切代价避免;你应该考虑中止一个线程的唯一一次是某种“紧急关闭”代码,你试图尽可能干净地拆除一个appdomain。
答案 1 :(得分:17)
因为如果您知道线程处于可以中止的安全状态,那么您肯定可以安排更好的通信并让线程干净地退出。
线程可能已经锁定并且正在更改某些共享状态,并且Thread.Abort将撤消锁定并使共享状态损坏。
答案 2 :(得分:13)
伤害自己更容易。正如其他人所说,它在代码中引发了一个异常,它可以在任何时候发生。如果您期望这样,并且编码方式可以在任何时候优雅地处理此异常,但有些人不会这样做,这可能没问题。
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()”的观点是一个好主意,而不是让人们记住编写一个强大的代码,以防止在该代码中任何地方出现的异常。
答案 3 :(得分:7)
简而言之。 任何IDisposable对象都不得处置。任何锁定的对象都可能无法解锁。必须100%执行的任何事情都将永远不会完成。
答案 4 :(得分:4)
当您在另一个线程上调用Thread.Abort()时,会在该线程的流中注入ThreadAbortException。如果你很幸运,代码将处理得很好并在一个定义良好的状态下中止。问题是你无法弄清楚你是否会在每种情况下都是幸运的,所以如果你更喜欢安全,抱歉在其他线程上调用Thread.Abort不是一个好主意。
答案 5 :(得分:2)
Thread.Abort以不受控制的方式停止你的线程。 thread.Abort将抛出一个异常,这将导致你的线程立即停止。
有什么问题:在大多数情况下,您希望优雅地停止正在执行的操作。例如,如果您正在执行ACID操作,您可能希望在结束线程之前完成当前操作,以便您的系统保持稳定状态。
答案 6 :(得分:1)
Thread.Abort在目标线程中引发异常。同时,目标线程可以执行一些关键操作,并且异常上升可能会破坏您的应用程序状态。