1

有时我在我的程序中使用了线程,但我从不使用 join()。我得到了一些关于 join() 的信息,如下所示

Join will stop the current running thread and let the "Join" thread runs until it finishes.

static void Main()
{
  Thread t = new Thread (Go);
  t.Start();
  t.Join();
  Console.WriteLine ("Thread t has ended!");
}

static void Go()
{
  for (int i = 0; i < 10; i++) Console.Write ("y");
}

从上面的代码中,我只是不明白 join() 在这里扮演什么样的重要角色。请讨论加入用法。

如果可能的话,给我一个关于join()的小现实代码,这样我就可以理解join()的良好用途。

还指导我 join() 可以在多线程环境中使用。谢谢

4

5 回答 5

4

以您发布的代码为例,如果它是这样编写的:

static void Main()
{
  Thread t = new Thread (Go);
  t.Start();
  Console.WriteLine ("Thread t has ended!");
}

static void Go()
{
  for (int i = 0; i < 10; i++) Console.Write ("y");
}

您的输出将类似于以下内容:

yyy 线程 t 已结束!yyyyyyy

意义Go()同时运行Console.WriteLine ("Thread t has ended!");

通过添加 t.join(),您可以等到线程完成后再继续。如果您只希望代码的一部分与线程同时运行,这很有用。

于 2013-03-27T13:16:22.290 回答
3

如果您从代码应用程序中删除 t.Join(),它将在您确定 Go() 方法执行之前结束执行。

如果您有 2 个或更多方法可以同时执行,但所有方法都需要完成,然后才能执行依赖于它们的方法,则 Join 非常有用。

请看下面的代码:

static void Main(string[] args)
        {
        Thread t1 = new Thread(Method1);
        Thread t2 = new Thread(Method2);
        t1.Start();
        t2.Start();
        Console.WriteLine("Both methods are executed independently now");
        t1.Join(); // wait for thread 1 to complete
        t2.Join(); // wait for thread 2 to complete
        Console.WriteLine("both methods have completed");
        Method3(); // using results from thread 1 and thread 2 we can execute  method3 that can use results from Method1 and Method2

        }
于 2013-03-27T13:19:37.763 回答
2

阻塞调用线程,直到线程终止。

注意:您还可以阻塞调用线程,直到线程终止或指定时间过去,同时继续运行标准 COM 和 SendMessage 泵。支持的。NET 紧凑型框架。

链接: http: //msdn.microsoft.com/fr-fr/library/system.threading.thread.join (v=vs.80).aspx

于 2013-03-27T13:14:27.800 回答
2

考虑一些游戏示例。

static void Main()
{
  Thread t = new Thread (LoadMenu);
  t.Start();
  Showadvertisement();
  t.Join();
  ShowMenu();
}

static void LoadMenu()
{
    //loads menu from disk, unzip textures, online update check.
}

static void Showadvertisement()
{
    //Show the big nvidia/your company logo fro 5 seconds
}

static void ShowMenu()
{
   //everithing is already loaded. 
}

关键是你可以在两个线程中做多件事,但在某一时刻你应该同步它们并确保一切都已经完成

于 2013-03-27T13:15:06.937 回答
0

.Join() 调用等待线程结束。我的意思是当您的 Go 方法返回时,此调用将返回。

于 2013-03-27T13:12:51.843 回答