制作线程Foreground VS thread.Join()



如果foreground thread是一个线程,它阻止进程终止,直到属于该进程的所有前台线程都结束,并且如果Join方法阻止调用线程,直到线程终止,那么这两种技术之间的真正区别是什么?

前景线程:

static void Main()
{
Thread foregroundThread = 
new Thread(new ThreadStart(SomeMethod));
foregroundThread.Name = "ForegroundThread";
foregroundThread.IsBackground = false;
foregroundThread.Start();
} 

Join()方法:

static void Main() 
{
Thread thread = 
new Thread(new ThreadStart(SomeMethod));
thread.Name = "Thread";
thread.Start();
thread.Join();
}

这两种方法有区别吗?

不同之处在于,当进程关闭/退出/停止时,它需要停止所有前台线程,然后才能安全地终止。第二个代码虽然给出了与第一个相同的结果,但它的行为方式不同。Join会阻止主线程的执行,而主线程是该进程的前台线程,这使得除非后台线程完成执行,否则无法安全地终止进程。

前台线程的主要好处是当您尝试从另一个后台线程启动线程时。

假设您正在尝试编写一个将重要数据写入磁盘的线程,而该线程是从后台线程启动的。现在,您需要确保,如果用户决定关闭您的进程,那么写入数据的线程在完成其指定任务之前不会在中途异常终止。

想象一下你有这样一个场景:

static void Main()
{
Thread backgroundThread = new Thread(new ThreadStart(SomeMethod));
thread.IsBackground = true;
backgroundThread.Start();
} 

static void SomeMethod() 
{
Thread thread = new Thread(new ThreadStart(SomeOtherMethod));
thread.Name = "ForegroundThread";
thread.IsBackground = false;
thread.Start();
}

在这里,尽管您的主线程创建了一个没有等待或联接的后台线程,但在后台线程创建的前台线程退出之前,您的进程永远不会退出。

区别在于Fire和Forget的概念。即不等待线程结束。如果调用Join方法,则显式地等待线程完成执行。

最新更新