为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

不负相思意 2019-12-25 10:28:00
在MSDN中,对Thread.Abort()方法的描述说:“调用此方法通常会终止线程。”为什么不总是?在哪种情况下它不会终止线程?还有其他终止线程的可能性吗?
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

Thread.Abort()ThreadAbortException在线程上注入a 。线程可以通过调用取消请求Thread.ResetAbort()。此外,还有某些代码部分,例如finally将在处理异常之前执行的块。如果线程由于某种原因卡在这样的块中,则永远不会在线程上引发异常。

由于调用者在调用时几乎没有控制线程的状态Abort(),因此通常不建议这样做。将消息传递给请求终止的线程。


查看完整回答
反对 回复 2019-12-25
?
catspeake

TA贡献1111条经验 获得超0个赞

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


这个问题是重复的。


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


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


是。您的问题在于,您永远不要启动无法礼貌地告知要停止的线程,并且该线程会及时停止。如果您必须启动一个线程,该线程可能会(1)难以停止,(2)越野车或最糟糕的(3)对用户不利的情况,那么正确的做法是使一个新进程,在新进程中启动线程,然后在您希望线程中断时终止该进程。唯一可以确保安全终止不合作的线程的事情是操作系统,将其整个过程都销毁了。


有关更多详细信息,请参见我对这个问题的回答过长:


在C#中的循环内使用lock语句


最后一点是相关的,我讨论了在中止线程之前应该等待多长时间杀死线程的注意事项。


查看完整回答
反对 回复 2019-12-25
?
烙印99

TA贡献1829条经验 获得超13个赞

为什么不总是?在什么情况下它不终止线程?


对于初学者来说,线程可能会抓住ThreadAbortException并取消自己的终止。否则,它可能会导致您尝试中止计算所需的时间。因此,运行时无法保证在您请求线程之后线程将始终终止。


ThreadAbortException 有更多:


调用Abort方法销毁线程时,公共语言运行库将引发ThreadAbortException。ThreadAbortException是可以捕获的特殊异常,但是它将在catch块的末尾自动再次引发。引发此异常时,运行时将在结束线程之前执行所有的finally块。由于线程可以在finally块中进行无限制的计算,或调用Thread.ResetAbort()取消中止,因此无法保证线程将永远结束。


您不需要Abort()手动创建线程。如果您只是让线程中的方法返回,那么CLR将为您完成所有的工作。这将正常结束线程。


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 2541 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信