3 回答
TA贡献1865条经验 获得超7个赞
Thread.Abort()
ThreadAbortException
在线程上注入a 。线程可以通过调用取消请求Thread.ResetAbort()
。此外,还有某些代码部分,例如finally
将在处理异常之前执行的块。如果线程由于某种原因卡在这样的块中,则永远不会在线程上引发异常。
由于调用者在调用时几乎没有控制线程的状态Abort()
,因此通常不建议这样做。将消息传递给请求终止的线程。
TA贡献1111条经验 获得超0个赞
在哪种情况下它不会终止线程?
这个问题是重复的。
使用Thread.Abort()有什么问题
还有其他终止线程的可能性吗?
是。您的问题在于,您永远不要启动无法礼貌地告知要停止的线程,并且该线程会及时停止。如果您必须启动一个线程,该线程可能会(1)难以停止,(2)越野车或最糟糕的(3)对用户不利的情况,那么正确的做法是使一个新进程,在新进程中启动线程,然后在您希望线程中断时终止该进程。唯一可以确保安全终止不合作的线程的事情是操作系统,将其整个过程都销毁了。
有关更多详细信息,请参见我对这个问题的回答过长:
在C#中的循环内使用lock语句
最后一点是相关的,我讨论了在中止线程之前应该等待多长时间杀死线程的注意事项。
TA贡献1829条经验 获得超13个赞
为什么不总是?在什么情况下它不终止线程?
对于初学者来说,线程可能会抓住ThreadAbortException并取消自己的终止。否则,它可能会导致您尝试中止计算所需的时间。因此,运行时无法保证在您请求线程之后线程将始终终止。
ThreadAbortException 有更多:
调用Abort方法销毁线程时,公共语言运行库将引发ThreadAbortException。ThreadAbortException是可以捕获的特殊异常,但是它将在catch块的末尾自动再次引发。引发此异常时,运行时将在结束线程之前执行所有的finally块。由于线程可以在finally块中进行无限制的计算,或调用Thread.ResetAbort()取消中止,因此无法保证线程将永远结束。
您不需要Abort()手动创建线程。如果您只是让线程中的方法返回,那么CLR将为您完成所有的工作。这将正常结束线程。
- 3 回答
- 0 关注
- 2541 浏览
添加回答
举报