如果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方法,则显式地等待线程完成执行。