代码之家  ›  专栏  ›  技术社区  ›  Maverick Meerkat

为什么主线程在旋转新线程时等待,而不是在执行任务时等待

  •  5
  • Maverick Meerkat  · 技术社区  · 6 年前

    我想知道为什么在一个控制台应用程序中,如果我旋转一个新的线程从主线程运行,即使主线程将到达终点,它也将等待,尽管如果我旋转一个新的任务,它将退出,而不是等待任务结束。

    例如

    static void Main(string[] args) 
    {
        Thread t = new Thread(new ThreadStart(SomeMethod));
        t.Start();            
        // Main will wait, and app won't close until SomeMethod finishes
    }
    

    VS

    static void Main(string[] args)
    {
        Task.Run(() => SomeMethod());
        // Main will close / app shuts down without waiting for SomeMethod to finish
    }
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Patrick Roberts Benjamin Gruenbaum    6 年前

    在阅读文档时 Thread.IsBackground 属性,您会注意到有两种类型的线程:后台线程和前台线程:

    …后台线程不会阻止进程终止。一旦属于进程的所有前台线程终止…所有剩余的后台线程都将停止,并且不会完成。

    为什么 Thread 构造函数阻止 Main 从终止开始的进程是因为默认情况下,它创建前台线程,而基于任务的异步操作自动在 ThreadPool 它默认使用后台线程,并允许进程在完成前终止。

        2
  •  -3
  •   Ross Miller    6 年前

    您已经将某个方法设置为在另一个线程上运行,因此它现在是异步的。您不需要等待结果,所以main只会继续并退出,从而杀死进程中的两个线程。

    用途:

    Task.Run(async () => await SomeMethod());
    

    假设某个方法是可等待的,否则您可以从外部等待结果。

    Task.Run(() => SomeMethod()).Result;