.NET Core环境下主线程是否会等待子线程执行完成?
问题原因解答
你的认知偏差来源于对.NET线程默认属性的不了解,核心规则是前台线程和后台线程的进程退出逻辑不同:
- 手动通过
new Thread()创建的线程默认是前台线程,进程必须等待所有前台线程执行完毕才会终止,哪怕主线程已经执行完成 Task.Run()默认使用线程池线程,线程池线程默认都是后台线程,进程退出时不会主动等待后台线程执行完成,会直接终止所有后台线程
两段代码的行为说明
- 使用
new Thread()的代码
你创建的是前台线程,所以主线程输出mission complete后,进程并不会退出,会等待子线程休眠10秒输出Thread complete后才会终止,因此你能看到完整的三行输出。
如果要让主线程跑完就直接退出,不需要等待该子线程,可以手动将线程标记为后台线程:
static void Main(string[] args) { new Thread(() => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10000); Console.WriteLine("Thread complete"); }) { // 显式标记为后台线程 IsBackground = true }.Start(); Console.WriteLine("mission complete"); }
修改后运行程序,主线程执行完成后进程会直接退出,不会输出Thread complete。
- 使用
Task.Run()的代码Task.Run()默认调度到线程池的后台线程执行,所以主线程执行完自身逻辑后,进程直接退出,后台线程会被强制终止,自然看不到10秒后的输出。
内容的提问来源于stack exchange,提问作者Lapenkov Vladimir
相关产品推荐
相关产品推荐

