Thread.Join和Task.Wait的区别

8

考虑下面的代码。

线程

static void Main(string[] args)
{
    Thread t = new Thread(Foo);
    t.Start();

    Console.WriteLine("Main ends.");
    //t.Join();
}

static void Foo()
{
    for (int x = 0; x < 1000000000; x++) ;

    Console.WriteLine("Foo ends.");
}

任务

static void Main(string[] args)
{
    Task t = new Task (Foo);
    t.Start();

    Console.WriteLine("Main ends.");
    t.Wait();
}

static void Foo()
{
    for (int x = 0; x < 1000000000; x++) ;

    Console.WriteLine("Foo ends.");
}

当使用Task时,我们需要t.Wait()来等待线程池线程完成后再结束主线程;但是当使用Thread时,我们不需要t.Join()就可以达到同样的效果。
问题:为什么不需要t.Join()来防止主线程在其他已生成的线程结束前结束?

5
现在将线程的IsBackground属性设置为true,然后再次进行测试。 - L.B
@L.B:好观点! - Second Person Shooter
第一个例子(使用Thread类)会等待线程完成,因为Thread默认情况下不在后台运行,而Task则相反。Task基于线程池概念,天生就在后台运行。 - Lior Kirshner
2个回答

4

有几个区别,但回答你的问题最重要的部分是线程池使用后台线程,这些线程不会阻止进程退出。您可以在这里了解更多信息。



-1

在任务已经启动后,无法使用 t.wait()。


1
“t”是什么?它是一个“Task”还是一个“Thread”? - Theodor Zoulias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接