在CLR中,后台和前台线程有什么区别?

时间:2009-08-25 19:57:48

标签: multithreading clr

后台线程和前台线程有什么区别?

7 个答案:

答案 0 :(得分:21)

来自MSDN

  

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

答案 1 :(得分:18)

请参阅this page

  • 前台线程能够阻止当前应用程序终止。 CLR不会关闭应用程序(也就是说,卸载托管AppDomain),直到所有前台线程都结束。

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

答案 2 :(得分:4)

默认情况下,线程是前台线程,这意味着它们可以使应用程序保持活动状态 其中任何一个正在运行。 C#还支持后台线程,后者没有保留 应用程序自行运行 - 一旦所有前台线程结束,立即终止。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

有两种类型的线程-

  • 前景线程
  • 背景线程

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

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

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

答案 6 :(得分:0)

背景线程将被杀死,无论是否还没有完成 前景线程。 >

前景线程的一个示例是应用程序主线程。

背景线程示例为:

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

有关更多信息,请查看这篇MSDN文章。