C#线程终止和Thread.Abort()

在MSDN中,对Thread.Abort()方法的描述说:“调用此方法通常会终止线程。”


为什么不总是?


在哪种情况下它不会终止线程?


还有其他终止线程的可能性吗?



不负相思意
浏览 2542回答 3
3回答

鸿蒙传说

Thread.Abort()ThreadAbortException在线程上注入a 。线程可以通过调用取消请求Thread.ResetAbort()。此外,还有某些代码部分,例如finally将在处理异常之前执行的块。如果线程由于某种原因卡在这样的块中,则永远不会在线程上引发异常。由于调用者在调用时几乎没有控制线程的状态Abort(),因此通常不建议这样做。将消息传递给请求终止的线程。

catspeake

在哪种情况下它不会终止线程?这个问题是重复的。使用Thread.Abort()有什么问题还有其他终止线程的可能性吗?是。您的问题在于,您永远不要启动无法礼貌地告知要停止的线程,并且该线程会及时停止。如果您必须启动一个线程,该线程可能会(1)难以停止,(2)越野车或最糟糕的(3)对用户不利的情况,那么正确的做法是使一个新进程,在新进程中启动线程,然后在您希望线程中断时终止该进程。唯一可以确保安全终止不合作的线程的事情是操作系统,将其整个过程都销毁了。有关更多详细信息,请参见我对这个问题的回答过长:在C#中的循环内使用lock语句最后一点是相关的,我讨论了在中止线程之前应该等待多长时间杀死线程的注意事项。

烙印99

为什么不总是?在什么情况下它不终止线程?对于初学者来说,线程可能会抓住ThreadAbortException并取消自己的终止。否则,它可能会导致您尝试中止计算所需的时间。因此,运行时无法保证在您请求线程之后线程将始终终止。ThreadAbortException 有更多:调用Abort方法销毁线程时,公共语言运行库将引发ThreadAbortException。ThreadAbortException是可以捕获的特殊异常,但是它将在catch块的末尾自动再次引发。引发此异常时,运行时将在结束线程之前执行所有的finally块。由于线程可以在finally块中进行无限制的计算,或调用Thread.ResetAbort()取消中止,因此无法保证线程将永远结束。您不需要Abort()手动创建线程。如果您只是让线程中的方法返回,那么CLR将为您完成所有的工作。这将正常结束线程。
打开App,查看更多内容
随时随地看视频慕课网APP