所以我知道你不应该用

Thread.Abort()

但我从来没有得到过一个好的解释.有没有表现惩罚或隐藏的trap ?

我知道你不能忽视/吞下ThreadAbortException(这是有道理的)

推荐答案

除了这里所有其他的好答案,让我补充一点,没有任何保证调用线程.Abort实际上会中止正在讨论的线程.可以(尽管不是特别容易)使线程"硬化"以防被中止.例如,如果您正在中止一个线程,因为您认为它正在运行恶意代码,那么恶意代码可能正在抵抗它自己的 destruct .

如果您有一个长期运行的操作,涉及到您不拥有的代码,必须将其清除,正确的方法是将该代码放入它自己的process,而不是它自己的线程中.(最好是在该过程中的高度安全限制的appdomain中.)然后你可以干净利落地终止这个过程.

简而言之,Thread.Abort充其量表示糟糕的设计,可能不可靠,而且极其危险.应该不惜一切代价避免这种情况;您唯一应该考虑中止线程的时候是在某种"紧急关机"代码中,在这种代码中,您试图尽可能干净地拆除appdomain.

.net相关问答推荐

从没有流的EventStore中读取流不存在异常

为什么我在环境变量中有不同的值?

.Net MAUI Android 无法与 API localhost 对话

如何在 NET 5 / 6 中使用 Direct3D11CaptureFramePool

使用 Thread.Abort() 有什么问题

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

实例化具有运行时确定类型的对象

为什么要判断这个!= null?

File.ReadAllLines() 和 File.ReadAllText() 有什么区别?

将跟踪输出重定向到控制台

如何将 UI Dispatcher 传递给 ViewModel

Await 运算符只能在 Async 方法中使用

如何在我的 C# 程序的面板中运行另一个应用程序?

ReaderWriterLockSlim 什么时候比简单的锁更好?

如何从头开始以编程方式配置 log4net(无配置)

IronPython 与 Python .NET

如何使用 NPOI 读取文件

C# 相当于 Java 的 Exception.printStackTrace()?

SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有什么区别?

有没有一种简单的方法来判断 .NET Framework 版本?