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