Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 主线程是前景线程还是背景线程?_C# - Fatal编程技术网

C# 主线程是前景线程还是背景线程?

C# 主线程是前景线程还是背景线程?,c#,C#,NET框架定义了两种类型的线程:前台线程和后台线程。 默认情况下,当我们创建一个线程时,它是一个前台线程,但我们可以将其更改为后台线程 所有进程都至少有一个执行线程,通常称为主线程,因为它是程序开始时执行的线程 此主线程是后台线程还是前台线程。后台线程的全部目的是,如果只剩下执行的线程是后台线程,则进程将退出 主线程必须是前台线程,否则应用程序将立即退出。后台线程的全部目的是,如果只剩下执行的线程是后台线程,则进程将退出 主线程必须是前台线程,否则应用程序将立即退出。最好完全摒弃“前台线程”的概

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

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


此主线程是后台线程还是前台线程。

后台线程的全部目的是,如果只剩下执行的线程是后台线程,则进程将退出


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

后台线程的全部目的是,如果只剩下执行的线程是后台线程,则进程将退出


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

最好完全摒弃“前台线程”的概念。CLR对此没有概念,也不以任何方式处理程序的启动线程。它只是一个“普通”线程,与使用thread类创建的任何其他线程都没有区别。“前台线程”之所以重要,是因为它正在做最可见和最“重要”的工作,这种观点有时是正确的,但并不总是正确的。例如,不是在服务或现代UI应用程序中,而是工作线程在其中完成繁重的工作。在控制台、Winforms或WPF应用程序中都是如此

这个概念在遗留运行时环境中确实有效,比如C或C++程序。他们的执行模型可以追溯到20世纪70年代,当时的操作系统不支持线程。在这种遗留运行时环境中,程序总是在启动线程结束时终止,而不管其他线程在运行什么。这不是CLR的工作方式,它认为其他线程同样重要。当然是

仍然考虑“背景线程”的概念是可以的。线程池线程当然是有背景的。它们的IsBackground属性始终为true。顺便说一句,您可以将其设置为false,CLR不再将其视为后台线程。但是你不能改变它的ApartmentState,它总是MTA,这使得它们根本不适合显示任何用户界面。换句话说,你永远看不到它们:)

背景线程最重要的属性是,你可以像对待小兵一样对待他们,你不介意在执行任务时被杀。随机且无任何通知,且预期不会造成可怕后果。当然,非常重要的是,他们做的是非关键性的工作。例如,如果让这样一个线程编写文件,这已经变得不确定了。当士兵中弹时,会留下一个半写的文件。这有一个诀窍,就是在以后导致麻烦,另一个读取该文件的程序将出现故障。网络或数据库连接通常用于后台线程。导线另一端的软件将检测到连接断开。否则它无法区分硬程序崩溃和正常退出。通常,这样的软件就是为了处理这个问题而编写的


长话短说,只有IsBackground属性才重要。当一个线程退出时,CLR迭代仍在运行的其余线程。如果其中任何一个的IsBackground=false,则进程将继续运行。否则,CLR将卸载主AppDomain。这会让任何一个士兵被粗暴地打中。

你最好完全摒弃“前景线”的概念。CLR对此没有概念,也不以任何方式处理程序的启动线程。它只是一个“普通”线程,与使用thread类创建的任何其他线程都没有区别。“前台线程”之所以重要,是因为它正在做最可见和最“重要”的工作,这种观点有时是正确的,但并不总是正确的。例如,不是在服务或现代UI应用程序中,而是工作线程在其中完成繁重的工作。在控制台、Winforms或WPF应用程序中都是如此

这个概念在遗留运行时环境中确实有效,比如C或C++程序。他们的执行模型可以追溯到20世纪70年代,当时的操作系统不支持线程。在这种遗留运行时环境中,程序总是在启动线程结束时终止,而不管其他线程在运行什么。这不是CLR的工作方式,它认为其他线程同样重要。当然是

仍然考虑“背景线程”的概念是可以的。线程池线程当然是有背景的。它们的IsBackground属性始终为true。顺便说一句,您可以将其设置为false,CLR不再将其视为后台线程。但是你不能改变它的ApartmentState,它总是MTA,这使得它们根本不适合显示任何用户界面。换句话说,你永远看不到它们:)

背景线程最重要的属性是,你可以像对待小兵一样对待他们,你不介意在执行任务时被杀。随机且无任何通知,且预期不会造成可怕后果。当然,非常重要的是,他们做的是非关键性的工作。例如,如果让这样一个线程编写文件,这已经变得不确定了。当士兵中弹时,会留下一个半写的文件。这有一个诀窍,就是在以后导致麻烦,另一个读取该文件的程序将出现故障。网络或数据库连接通常用于后台线程。导线另一端的软件将检测到连接断开。否则,它无法区分硬程序崩溃和硬程序崩溃