前台线程退出后后台线程执行事件?

时间:2019-05-29 10:15:18

标签: c# multithreading threadpool

我正在浏览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

这意味着即使主前景线程已退出,后台线程仍会执行。为什么这样?

1 个答案:

答案 0 :(得分:0)

Main方法的结尾并不意味着“前景”线程已退出。即使有,也并不意味着您的进程已终止。

通常,当进程中运行的所有线程(包括来自线程池中已排队工作的线程)终止时,进程停止。但是,如果您使用ExitProcess退出进程。 CLR的工作方式复杂得多(see here),在真正存在该应用程序之前进行了一些清理。

结果,在所有工作线程被杀死之前,有相当一段时间可以完成工作。