如果foreground thread
是一个线程,它阻止进程终止,直到属于该进程的所有前台线程都已完成,并且Join
方法阻塞调用线程直到线程终止,那么什么是真的是两种技术的区别吗?
前景主题:
static void Main()
{
Thread foregroundThread =
new Thread(new ThreadStart(SomeMethod));
foregroundThread.Name = "ForegroundThread";
foregroundThread.IsBackground = false;
foregroundThread.Start();
}
加入()方法:
static void Main()
{
Thread thread =
new Thread(new ThreadStart(SomeMethod));
thread.Name = "Thread";
thread.Start();
thread.Join();
}
两种方法之间有区别吗?
答案 0 :(得分:2)
不同之处在于,当一个进程关闭/退出/停止时,它需要所有前台线程在它可以安全终止之前停止。你的第二个代码虽然给出了与第一个代码相同的结果,但它的行为方式不同。 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();
}
虽然你的主线程创建了一个没有等待或连接的后台线程,但是在后台线程创建的前台线程退出之前,你的进程永远不会退出。
答案 1 :(得分:0)
不同之处在于Fire和Forget.i.e的概念。一个人不等待线程的结束。如果调用Join方法,则显式等待线程完成执行。