当应用程序关闭时,我可以检测应用程序何时杀死后台线程吗?

时间:2012-06-13 07:27:14

标签: c# multithreading threadabortexception isbackground

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

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

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

2 个答案:

答案 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对象不会保留在内存中。当没有对线程对象的引用时,垃圾收集器可以从内存中删除线程对象。