为什么主线程在不使用join()的情况下等待其他线程



如果我的问题看起来很天真,我很抱歉。我是C#和的新手。网,我的头仍然围绕着他们。我有围棋的背景,并努力学习C#。Net多线程。

在Go中,如果不使用等待,则不管其他线程如何,主线程都将运行并完成其逻辑。我认为在C#中应该是一样的,但是,下面的代码允许所有线程完全运行。这意味着主线程等待其他线程完成,而不使用join((或任何其他等待技术。你能告诉我我错过了什么或误解了什么吗。

namespace TestThread
{
internal class Program
{
static void Main(string[] args)
{
Thread T1 = new Thread(PrintY);
T1.Start();

// The following is the funtion of the Main thread.
for (int i = 0; i < 10; i++) Console.Write("x");
}
static void PrintY()
{
for (int i = 0; i < 100; i++)
{
Console.Write("Y");
Thread.Sleep(100);
}
}

}
}

输出如下:

xxxxxxxxx-YYYYYYYYYYYYYYYYYYYYYYYYYY/pre>在Main方法结束之前,我预计结果中最多会有一个Y,因此该过程终止。当主线程完成时,是什么使进程保持活动状态?

默认情况下,通过构造函数创建Thread时,其Thread.IsBackground设置为false:

线程可以是后台线程,也可以是前台线程。后台线程与前台线程相同,只是后台线程不会阻止进程终止。一旦属于一个进程的所有前台线程都终止了,公共语言运行库就会结束该进程。任何剩余的后台线程都将停止并且不会完成。

和:

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

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

因此它将阻止应用程序终止。如果您希望线程允许应用程序终止,可以将此属性设置为false:

Thread T1 = new Thread(PrintY);
T1.IsBackground = true;
...

还要注意,在现代C#中很少需要手动创建线程。在引入任务并行库(TPL(之后,通常使用TaskAPI,而不是直接操作线程(例如,在这种情况下可以使用_ = Task.Run(PrintY);(。

最新更新