12

我在 C# 中使用一个线程,我将 IsBackground 属性设置为 true。线程在循环中运行一些代码,直到应用程序关闭。当应用程序关闭时,线程也停止执行(因为我设置了 IsBackground = true)。

应用程序如何杀死线程?似乎它不会通过调用 abort 来做到这一点,因为我没有得到 ThreadAbortException。它发生在幕后吗?我想在我的 finally 循环块中做一些回滚。

我知道我可以自己在线程上调用 abort,但我想知道应用程序如何关闭我的后台线程,以及我是否可以从线程内部对其做出反应。我知道我可以订阅 Application.ApplicationExit 事件,但我在服务和 winform 中都运行此代码,我更喜欢在循环中捕获异常,以便能够在 finally 语句中回滚。

4

2 回答 2

5

似乎它没有通过调用 abort 来做到这一点,因为我没有得到 ThreadAbortException

确实如此,CLR 有两种方法可以中止线程。“正常”方式,通过 Thread.Abort() 调用,线程可以看到 ThreadAbortException。但也有粗鲁的中止,以同样的方式工作。但是减去 TAE 并且没有 finally 块执行。你无法观察它。

于 2012-06-13T08:16:42.763 回答
1

thread操作系统将处理器分配给thread. 当 Started 线程第一次收到处理器并成为 Running 线程时,该线程ThreadStart delegate将执行其 ,它指定线程在其生命周期中将执行的操作。当程序创建一个新线程时,程序将线程指定为ThreadStart delegate线程构造函数的参数。

正在运行的线程在其终止时进入Stopped (or Dead)状态。ThreadStart delegate在您的情况下,您的主线程已终止。因此,您的ThreadStart delegate对象不会保留在内存中。当没有对线程对象的引用时,垃圾收集器可以从内存中删除线程对象。

于 2012-06-13T08:01:50.120 回答