.NET框架定义了两种类型的线程:前台和后台。默认情况下,当我们创建一个线程时,它是一个前台线程,但我们可以将其更改为后台线程
所有进程至少有一个执行线程,通常称为主线程,因为它是在程序开始时执行的线程。
这个主线程是后台线程还是前台线程。
发布于 2015-02-08 19:48:49
你最好完全摒弃“前台线程”的概念。CLR没有它的概念,也不以任何方式特殊对待程序的启动线程。它只是一个“普通”线程,与使用thread类创建的任何其他线程没有什么不同。“前台线程”之所以重要是因为它正在做最明显和最“重要”的工作,这一概念有时是正确的,但并不总是正确的。例如,不是在服务或现代UI应用程序中,而是工作线程在它们中执行繁重的任务。在控制台、Winforms或WPF应用程序中也是如此。
这个概念只有在遗留的运行时环境中才真正有效,比如C或C++程序。他们的执行模型可以追溯到20世纪70年代,当时的操作系统还不支持线程。在这样的遗留运行时环境中特定的是,程序总是在启动线程结束时终止,而不管其他线程正在运行什么。这不是CLR的工作方式,它认为其他线程也同样重要。他们当然是。
仍然在考虑“背景线程”的概念是可以的。线程池线程当然是有背景的。它们的IsBackground属性始终为真。一些你可以改变的东西,你可以简单地将它设置为false,CLR不再把它当作后台线程来处理。但是你不能改变它的ApartmentState,它总是MTA,这使得它们根本不适合显示任何用户界面。换句话说,您永远看不到它们:)
后台线程最重要的属性是,你可以把他们当做小士兵,你不介意在执行任务时被杀。随机的,没有任何通知,没有可怕后果的预期。当然,非常重要的是他们做了一项非关键的工作。例如,如果你让这样一个线程写一个文件,它就会变得可疑。当士兵中枪的时候会留下一份写了一半的文件。它有一个制造麻烦的诀窍,另一个读取该文件的程序将会出现故障。网络或dbase连接通常用于后台线程。线路另一端的软件将检测到连接丢失。否则它无法区分硬程序崩溃和正常退出之间的区别。通常情况下,这样的软件就是为了解决这个问题而编写的。
长话短说,只有IsBackground属性很重要。当线程退出时,CLR会迭代其余仍在运行的线程。如果它们中的任何一个具有IsBackground = false,那么进程将继续运行。如果不是,CLR将卸载主AppDomain。这会让任何士兵被粗鲁的中止。
发布于 2015-02-08 14:02:46
后台线程的整个目的是,如果只剩下后台线程在执行,则进程将退出。
主线程需要是前台线程,否则应用程序将立即退出。
https://stackoverflow.com/questions/28391086
复制相似问题