C# 在CLR中,背景线程和前景线程之间的区别是什么?

C# 在CLR中,背景线程和前景线程之间的区别是什么?,c#,multithreading,clr,C#,Multithreading,Clr,背景线程和前景线程的区别是什么?来自: 后台线程与 前台线程有一个例外: 后台线程不保留 托管执行环境正在运行 见: 前台线程能够阻止当前应用程序终止。在所有前台线程结束之前,CLR不会关闭应用程序(也就是说,卸载宿主AppDomain) CLR将后台线程(有时称为守护进程线程)视为在任何时间点都可以忽略的可消耗执行路径(即使它们当前正在处理某些工作单元)。因此,如果所有前台线程都已终止,则当应用程序域卸载时,任何和所有后台线程都将自动终止 默认情况下,线程是前台线程,这意味着它们可以使应用程

背景线程和前景线程的区别是什么?

来自:

后台线程与 前台线程有一个例外: 后台线程不保留 托管执行环境正在运行

见:

  • 前台线程能够阻止当前应用程序终止。在所有前台线程结束之前,CLR不会关闭应用程序(也就是说,卸载宿主AppDomain)

  • CLR将后台线程(有时称为守护进程线程)视为在任何时间点都可以忽略的可消耗执行路径(即使它们当前正在处理某些工作单元)。因此,如果所有前台线程都已终止,则当应用程序域卸载时,任何和所有后台线程都将自动终止


默认情况下,线程是前台线程,这意味着它们可以使应用程序在最长时间内保持活动状态 他们中的任何一个都在跑步。C#还支持后台线程,不保留
应用程序自身处于活动状态–在所有前台线程结束后立即终止。

如果任何前台或后台线程终止,应用程序将立即死亡。在应用程序生命周期的任何时候,都可以将线程从前台更改为后台,反之亦然。CLR创建两种线程以更好地支持AppDomain。如果前台线程终止,CLR将强制结束正在运行的任何后台线程。由本机代码创建并进入托管执行环境的任何线程都被标记为后台线程。

后台线程和前台线程之间的重要区别如下:后台线程仅在执行的前台线程数小于后台线程数时才执行处理器。

有两种类型的线程-

  • 前景线程

  • 背景线程

    每当我们打开任何应用程序时,主UI线程的类型都是前台线程。这是默认的线程类型。假设当我们创建任何新线程时,默认情况下线程的当前类型是前台本身。如果要更改线程类型,必须执行threadName.IsBackground=true; 现在主要的故事开始了。有什么区别?为什么我们需要这两种类型

前景线程:假设我们正在创建一个线程ThreadA。如果我们需要线程ThreadA在所有其他线程都被中止的情况下保持执行,即使我们的主UI线程不再处于活动状态,那么在这种情况下,我们必须保持线程类型前台。因此,如果您保持线程前台类型,那么即使关闭应用程序,前台线程ThreadA也将继续运行,您也可以在任务管理器中跟踪它


后台线程:现在,如果将线程类型更改为后台线程,则此线程将依赖于其他前台线程。因为在这种情况下,如果前台类型的线程不再运行,那么所有后台线程都必须被强制中止。

后台线程将被终止,无论它是否尚未完成,当没有活动的前台线程时

前台线程的一个例子是应用程序主线程


背景线程示例如下:

  • System.Threading.Task
    class
  • System.Threading.ThreadPool
    class

有关更多信息,请查看本文。

澄清:C#没有背景线程和前景线程的概念。某些场景对线程的区分是在CLR/COM级别完成的。C#也没有Giraffe的概念,但您可以使用名为Giraffe的属性创建一个类。IsBackground是框架中对象的属性。记住,C语言不是.NET框架。这只是一种编程语言。@Guffa:我不懂。你在为MSDN文档的解释而争论?它的上下文切换优先级是否也较低?你的意思是,间接地说,后台线程的优先级低于前台线程的优先级?而后台线程是在前台线程的命运,让他们得到一个机会?