我可以检测应用程序关闭时后台线程何时被应用程序终止吗?

本文关键字:应用程序 何时 终止 线程 后台 检测 我可以 | 更新日期: 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对象不会保留在内存中。当没有对线程对象的引用时,垃圾回收器可以从内存中删除线程对象。