制作线程Foreground VS Thread.Join()

时间:2014-02-09 13:33:38

标签: c# .net multithreading

如果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();
    }

两种方法之间有区别吗?

2 个答案:

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