主线程是否等待子线程完成?

Lap*_*mir 0 .net c# multithreading .net-core

我有 Windows 上的 .net core 和简单的代码。如您所见,没有Join()礼物。所以主线程不等待子线程,但是当我运行时:

C:\...\bin\Release\netcoreapp3.1>dotnet ConsoleAppTest.dll
> 4
> mission complete
> Thread complete
Run Code Online (Sandbox Code Playgroud)

C#代码:

C:\...\bin\Release\netcoreapp3.1>dotnet ConsoleAppTest.dll
> 4
> mission complete
> Thread complete
Run Code Online (Sandbox Code Playgroud)

我认为主线程应该运行而不是等待子线程。我错了吗?

当我启动时

 Task.Run(() =>
            {
                Thread.Sleep(10000);
                Console.WriteLine("Thread complete");
            });
Run Code Online (Sandbox Code Playgroud)

主线程不等待

Gur*_*ron 5

来自Thread.IsBackground文档:

后台线程与前台线程相同,只是后台线程不会阻止进程终止。一旦属于某个进程的所有前台线程都终止,公共语言运行时就会结束该进程。

默认情况下,以下线程在前台执行(即它们的 IsBackground属性返回false):

  • 主线程(或主应用程序线程)。
  • 通过调用Thread类构造函数创建的所有线程。

您正在创建前台线程,这会阻止您的进程终止。

另请注意,由于引入了TPL,通常不建议直接使用线程,但如果有特殊原因需要使用它们,您可以将该IsBackground属性设置true为允许进程终止:

var thread = new Thread(() =>
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(1000);
    Console.WriteLine("Thread complete");
});
thread.IsBackground = true;
thread.Start();
Run Code Online (Sandbox Code Playgroud)