我刚刚开始研究用于我创建的程序的线程。我有几个问题,我认为我知道答案,但可以使用一些澄清。
一旦创建了一个线程,它是否总是存活/存在/那里(不确定正确的描述)直到中止?
当线程被中止/停止时,它只会通过抛出错误而中止?
如果以上(中止抛出错误)为真,那么如何在每次线程结束时都不运行现有的catch命令的情况下将其合并到现有的try / catch中?
正如我所说,我刚刚开始学习线程,所以请原谅我,如果这个问题有点过于“Noob”。我找到了很多信息,但是我得到的信息越多,我的问题就越多。
谢谢
答案 0 :(得分:2)
一旦创建了一个线程,它是否总是活着/活着/那里(不确定 正确的描述)直到中止?
不,它将一直存在,直到方法块的执行没有完成。一旦执行完成,它就不再存在。
如果它是非线程池线程,那么它已经结束并变得不可用,但如果它是线程池线程,那么它就会回到池中。因此,无论何时进入,都可以为其分配新的请求。
当线程被中止/停止时,它只会通过抛出一个中止而中止 错误?
是的它会抛出一个ThreadAbortException
,但你为什么会中止?
如果您要取消它,请尝试使用BackGroundWorker
或System.Threading.Tasks.Task
。见Task Cancellation
答案 1 :(得分:1)
澄清......
任何线程都可能“运行直到它停止本身。”也就是说,直到它正常终止。如果你希望它能早点停止,我建议你应该以某种合适的方式发信号“停止它正在做的事情,并尽快退出。”
(将线程或进程视为 worker 也可能有用,它可能在其生命周期内完成许多工作单元。设置和拆除与让它过上漫长而富有成效的生活相比,这样的事情是昂贵的......)
将枪指向一个过程或线程的头部然后扣动扳机永远不是一个好主意,因为当致命的子弹到达时你无法知道“在做的过程中”可能是什么。任何事情都可能发生,你永远无法重现它。
是的,“未捕获的异常”将导致线程或进程死亡......特别是在线程(与其同伴共享内存和其他所有内容)的情况下,这可能是更严重的应用程序错误的领头羊,你将无法轻易检测到。因此,我建议您应始终在任何线程或进程的最外层处理程序中使用错误捕获机制。允许线程 catch 和(尝试)报告错误之前:“它终止本身如同慷慨地可能的“。