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