我正在浏览ThreadPool
的Microsoft文档,他们解释说ThreadPool
线程是后台线程,如果所有前台线程都已终止,它们将无法使应用程序运行。
这是代码段:
public static void Main()
{
ThreadPool.QueueUserWorkItem(ThreadProc);
Console.WriteLine("From main foreground thread");
//Thread.Sleep(1000);
Console.WriteLine("Exiting from main");
}
static void ThreadProc(object stateInfo) {
Console.WriteLine("From the thread pool");
}
在未注释Thread.Sleep(1000)
的情况下,确保后台线程将在主前台线程退出之前完成。但是当我们评论睡眠部分时,我也会得到一个排序结果:
From main foreground thread
Exiting from main
From the thread pool
这意味着即使主前景线程已退出,后台线程仍会执行。为什么这样?
答案 0 :(得分:0)
Main方法的结尾并不意味着“前景”线程已退出。即使有,也并不意味着您的进程已终止。
通常,当进程中运行的所有线程(包括来自线程池中已排队工作的线程)终止时,进程停止。但是,如果您使用ExitProcess退出进程。 CLR的工作方式复杂得多(see here),在真正存在该应用程序之前进行了一些清理。
结果,在所有工作线程被杀死之前,有相当一段时间可以完成工作。