Jan*_*ter 62 .net c# multithreading
所以我知道你不应该使用
Thread.Abort()
Run Code Online (Sandbox Code Playgroud)
但我从未得到过很好的解释.是否存在性能损失或隐藏的问题?
我知道你不能忽略/吞下ThreadAbortException(这是有道理的)
Eri*_*ert 80
除了这里所有其他好的答案之外,让我补充说,无法保证调用Thread.Abort实际上会中止有问题的线程.有可能(虽然不是特别容易)"强化"线程以防止被中止.例如,如果您因为认为它运行恶意代码而中止线程,则恶意代码可能会抵制其自身的破坏.
如果你有一个长期运行的操作涉及你不拥有的代码必须干净地删除,那么正确的方法是将代码放在它自己的进程中,而不是它自己的线程中.(最好是在该过程中高度安全性受限的应用程序域中.)然后,您可以彻底杀死该进程.
简而言之,Thread.Abort充其量只是表明设计糟糕,可能不可靠,而且非常危险.应该不惜一切代价避免; 你应该考虑中止线程的唯一一次是某种"紧急关闭"代码,你试图尽可能干净地拆除appdomain.
Dam*_*ver 17
因为如果您知道线程处于可以中止的安全状态,那么您肯定可以安排更好的通信并让线程干净地退出.
该线程可能已经锁定并且正在更改某些共享状态,并且Thread.Abort将撤消锁定并使共享状态损坏.
Qui*_*ome 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();
Run Code Online (Sandbox Code Playgroud)
此外,如果您与团队中的许多人合作,除非您有良好的代码审查,否则您无法保证您将使用的代码的质量.因此,传播"没有Thread.Abort()"的观点是一个好主意,而不是让人们记住编写对该代码中任何地方发生的异常具有鲁棒性的代码.
简而言之.任何IDisposable对象都不得处置.任何锁定的对象都可能无法解锁.任何必须100%执行的事情永远不会完成.
当您在另一个线程上调用 Thread.Abort() 时,会在该线程的流中注入 ThreadAbortException。如果你很幸运,代码会很好地处理这个问题并在一个明确定义的状态中中止。问题是您无法确定是否在每种情况下都很幸运,因此如果您更喜欢安全而不是抱歉在其他线程上调用 Thread.Abort 不是一个好主意。