【发布时间】:2019-05-29 10:15:18
【问题描述】:
我正在查看 ThreadPool 的 Microsoft 文档,他们解释说 ThreadPool 线程是后台线程,如果所有前台线程都已终止,则不会保持应用程序运行。
这里是sn-p的代码:
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
这意味着即使主前台线程已经退出,后台线程仍然会执行。为什么会这样?
【问题讨论】:
-
这是一个经典的线程竞赛错误。在 Console.WriteLine() 调用之后和 CLR 可以终止程序之前发生的事情确实。几乎不需要,线程池线程很可能阻塞在互斥锁上,从而防止控制台的输出混淆。因此,轮到它只需要几纳秒。在非托管代码中运行,CLR 在完成之前无法中止。
-
+1。在您当前的代码中,只需将
Thread.Sleep(1000);放在Console.WriteLine("From the thread pool");之前,就可以看到它不再显示了。 -
永远,永远不要使用 Sleep() 修复线程争用错误。
-
我的评论不是关于修复比赛,而是关于显示程序不等待池中的线程完成。
标签: c# multithreading threadpool