首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主线程是前台线程还是后台线程?

主线程是前台线程还是后台线程?
EN

Stack Overflow用户
提问于 2015-02-08 13:59:53
回答 2查看 874关注 0票数 2

.NET框架定义了两种类型的线程:前台和后台。默认情况下,当我们创建一个线程时,它是一个前台线程,但我们可以将其更改为后台线程

所有进程至少有一个执行线程,通常称为主线程,因为它是在程序开始时执行的线程。

这个主线程是后台线程还是前台线程。

EN

回答 2

Stack Overflow用户

发布于 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。这会让任何士兵被粗鲁的中止。

票数 5
EN

Stack Overflow用户

发布于 2015-02-08 14:02:46

后台线程的整个目的是,如果只剩下后台线程在执行,则进程将退出。

主线程需要是前台线程,否则应用程序将立即退出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28391086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档