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

San*_*box 13 clr multithreading

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

Mat*_*nes 21

来自MSDN:

后台线程与前台线程相同,但有一个例外:后台线程不会使托管执行环境保持运行.

  • @Guffa:我不明白。您在对 MSDN 文档的解释争论不休? (2认同)

Zed*_*Zed 19

这个页面:

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

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


小智 6

默认情况下,线程是前台线程,这意味着只要它们中的任何一个正在运行,它们就会使应用程序保持活动状态。C# 还支持后台线程,它不会让应用程序自己保持活动状态——一旦所有前台线程都结束就立即终止。


小智 5

有两种类型的线程 -

  • 前台线程

  • 后台线程

    每当我们打开任何应用程序时,主 UI 线程都是前台线程类型。这是默认的线程类型。假设当我们创建任何新线程时。默认情况下,线程当前类型是前台本身。如果你想改变线程的类型,你必须执行threadName.IsBackground = true;

现在主要故事开始了。有什么不同?为什么我们需要这两种类型?

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

后台线程:现在,如果您将线程类型更改为后台线程,那么该线程将依赖于其他前台线程。因为在这种情况下,如果没有任何前台类型的线程在运行,那么所有后台线程都将不得不被强制中止。