You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core环境下主线程是否会等待子线程执行完成?

问题原因解答

你的认知偏差来源于对.NET线程默认属性的不了解,核心规则是前台线程和后台线程的进程退出逻辑不同:

  • 手动通过new Thread()创建的线程默认是前台线程,进程必须等待所有前台线程执行完毕才会终止,哪怕主线程已经执行完成
  • Task.Run()默认使用线程池线程,线程池线程默认都是后台线程,进程退出时不会主动等待后台线程执行完成,会直接终止所有后台线程

两段代码的行为说明

  1. 使用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。

  1. 使用Task.Run()的代码
    Task.Run()默认调度到线程池的后台线程执行,所以主线程执行完自身逻辑后,进程直接退出,后台线程会被强制终止,自然看不到10秒后的输出。

内容的提问来源于stack exchange,提问作者Lapenkov Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:06:04