.NET Framework定义了两种类型的线程:前景和后台。 默认情况下,当我们创建一个线程时,它是一个前台线程,但我们可以将其更改为后台
所有进程至少有一个执行线程,通常称为主线程,因为它是程序开始时执行的线程。
这个主线程是后台还是前台线程。
答案 0 :(得分:4)
你完全不理会“前景线程”的概念真的是最好的。 CLR没有它的概念,也没有以任何方式处理程序特殊的启动线程。它只是一个“普通”线程,与您使用Thread类创建的任何其他线程没有什么不同。 “前景线程”之所以重要,因为它正在做最明显和最“重要”的工作,这种观念有时是真实的,但并非总是如此。例如,不是在服务或现代UI应用程序中,工作者线程在其中执行繁重的工作。它在控制台,Winforms或WPF应用程序中都是真实的。
该概念仅在遗留运行时环境中真正有效,如C或C ++程序。他们的执行模型可以追溯到20世纪70年代,操作系统当时并不支持线程。此类遗留运行时环境中的特定情况是,无论其他线程正在运行,程序始终在启动线程结束时终止。这不是CLR的工作方式,它认为其他线程同样重要。他们当然是。
仍在考虑“后台线程”的概念是可以的。线程池线程肯定是背景的。他们的IsBackground属性始终是 true 。你可以改变btw的东西,你可以简单地将它设置为 false ,而CLR不再将它视为后台线程了。但是你不能改变它的ApartmentState,它总是MTA,这使它们从根本上不适合显示任何用户界面。换句话说,你永远看不到它们:)
后台线程最重要的属性是你可以像对待那些你不介意在执行任务中被杀的小兵一样对待它们。随机地,没有任何通知和期望没有可怕的后果。当然,他们做非关键性工作非常重要。例如,如果你让这样的线程写一个文件,它就会变得不确定。当士兵被枪杀时,这将留下一个半文件。这有一个后来导致麻烦的诀窍,另一个程序读取该文件将出现故障。网络或dbase连接是后台线程的典型连接。电线另一端的软件将检测到连接丢失。它不能说出硬件程序崩溃和正常退出之间的区别。趋于结束没问题,通常,编写此类软件是为了解决这个问题。
长话短说,只有IsBackground属性很重要。当线程退出时,CLR会迭代仍在运行的其余线程。如果其中任何一个具有IsBackground = false,则该进程将继续运行。如果没有,CLR将卸载主AppDomain。这让任何士兵都以粗鲁的堕胎开枪。
答案 1 :(得分:0)
后台线程的全部目的是,如果剩下执行的唯一线程是后台线程,则进程将退出。
主线程需要是前台线程,否则应用程序会立即退出。