我在C#中使用了一个线程,我将IsBackground属性设置为true。线程在循环中运行一些代码,直到应用程序关闭。当应用程序关闭时,线程也会停止执行(因为我设置了IsBackground = true)。
应用程序如何杀死线程?它似乎不是通过调用abort来实现的,因为我没有得到ThreadAbortException。它是在幕后发生的吗?我想在我的最后一个循环块中做一些回滚。
我知道我可以自己在线程上调用abort,但是我想知道应用程序如何关闭我的后台线程,以及我是否可以从线程内部做出反应。我知道我可以订阅Application.ApplicationExit事件,但是我在服务和winform中运行这个代码,我更喜欢在循环中捕获异常,所以我能够在finally语句中回滚。 / p>
答案 0 :(得分:5)
似乎它没有通过调用abort来执行它,因为我没有得到ThreadAbortException
确实如此,CLR有两种方法可以中止线程。通过Thread.Abort()调用的“正常”方式,该线程可以看到一个ThreadAbortException。但也有一个粗鲁的中止,以同样的方式工作。但是减去TAE并且没有最终块执行。你无法观察它。
答案 1 :(得分:1)
当操作系统将处理器分配给thread
时,已启动thread
进入运行状态(即,开始执行)。当Started线程第一次收到处理器并成为Running线程时,线程执行其ThreadStart delegate
,它指定线程在其生命周期内将执行的操作。当程序创建一个新的Thread时,程序将Thread的ThreadStart delegate
指定为Thread构造函数的参数。
正在运行的线程在其Stopped (or Dead)
终止时进入ThreadStart delegate
状态。在您的情况下,您的主线程终止。因此,您的ThreadStart delegate
对象不会保留在内存中。当没有对线程对象的引用时,垃圾收集器可以从内存中删除线程对象。