为什么Main在旋转新线程时会等待,但对于任务来说则不然

Dav*_*eli 5 c# multithreading console-application task-parallel-library

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

例如

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
}
Run Code Online (Sandbox Code Playgroud)

static void Main(string[] args)
{
    Task.Run(() => SomeMethod());
    // Main will close / app shuts down without waiting for SomeMethod to finish
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*rts 5

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

...后台线程不会阻止进程终止.一旦属于某个进程的所有前台线程都已终止......任何剩余的后台线程都会停止并且不会完成.

为什么原因Thread构造防止Main过程从终止是因为默认情况下,它会创建前台线程,而基于任务的异步操作的自动执行ThreadPool,它默认使用后台线程,并允许他们完成之前要终止的进程.