中止c#threads

时间:2016-07-20 11:37:03

标签: c# multithreading

我刚刚开始研究用于我创建的程序的线程。我有几个问题,我认为我知道答案,但可以使用一些澄清。

一旦创建了一个线程,它是否总是存活/存在/那里(不确定正确的描述)直到中止?

当线程被中止/停止时,它只会通过抛出错误而中止?

如果以上(中止抛出错误)为真,那么如何在每次线程结束时都不运行现有的catch命令的情况下将其合并到现有的try / catch中?

正如我所说,我刚刚开始学习线程,所以请原谅我,如果这个问题有点过于“Noob”。我找到了很多信息,但是我得到的信息越多,我的问题就越多。

谢谢

2 个答案:

答案 0 :(得分:2)

  

一旦创建了一个线程,它是否总是活着/活着/那里(不确定   正确的描述)直到中止?

不,它将一直存在,直到方法块的执行没有完成。一旦执行完成,它就不再存在。

如果它是非线程池线程,那么它已经结束并变得不可用,但如果它是线程池线程,那么它就会回到池中。因此,无论何时进入,都可以为其分配新的请求。

  

当线程被中止/停止时,它只会通过抛出一个中止而中止   错误?

是的它会抛出一个ThreadAbortException,但你为什么会中止?

如果您要取消它,请尝试使用BackGroundWorkerSystem.Threading.Tasks.Task。见Task Cancellation

答案 1 :(得分:1)

澄清......

任何线程都可能“运行直到停止本身。”也就是说,直到它正常终止。如果你希望它能早点停止,我建议你应该以某种合适的方式发信号“停止它正在做的事情,并尽快退出。”

(将线程或进程视为 worker 也可能有用,它可能在其生命周期内完成许多工作单元。设置和拆除与让它过上漫长而富有成效的生活相比,这样的事情是昂贵的......)

将枪指向一个过程或线程的头部然后扣动扳机永远不是一个好主意,因为当致命的子弹到达时你无法知道“在做的过程中”可能是什么。任何事情都可能发生,你永远无法重现它。

是的,“未捕获的异常”将导致线程或进程死亡......特别是在线程(与其同伴共享内存和其他所有内容)的情况下, catch 和(尝试)报告错误之前:“它终止本身如同慷慨地可能的“。