【问题标题】:What is the significance of Thread.Join in C#?C#中Thread.Join的意义是什么?
【发布时间】:2020-10-27 10:27:28
【问题描述】:

C#中Thread.Join方法的意义是什么?

MSDN 说它会阻塞调用线程,直到线程终止。谁能用一个简单的例子来解释一下?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    Join() 基本上就是while(thread.running){}

    {
      thread.start()
      stuff you want to do while the other thread is busy doing its own thing concurrently
      thread.join()
      you won't get here until thread has terminated.
    } 
    

    【讨论】:

      【解决方案2】:
      int fibsum = 1;
      
      Thread t = new Thread(o =>
                                {
                                    for (int i = 1; i < 20; i++)
                                    {
                                        fibsum += fibsum;
                                    }
                                });
      
      t.Start();
      t.Join(); // if you comment this line, the WriteLine will execute 
                // before the thread finishes and the result will be wrong
      Console.WriteLine(fibsum);
      

      【讨论】:

        【解决方案3】:

        假设您有一个将一些工作委托给工作线程的主线程。主线程需要一些工作线程正在计算的结果,因此在所有工作线程完成之前它无法继续。

        在这种情况下,主线程会在每个工作线程上调用Join()。在所有Join() 调用都返回后,主线程知道所有工作线程都已完成,并且计算结果可供其使用。

        【讨论】:

          【解决方案4】:

          假设您的程序在Thread1 中运行。然后你需要开始一些计算或处理——你开始另一个线程——Thread2。然后,如果您希望 Thread1 等到 Thread2 结束,则执行 Thread1.Join(); 并且 Thread1 将在 Thread2 完成之前继续执行。

          这是MSDN中的描述。

          【讨论】:

          • MSDN 说“阻塞调用线程直到线程终止,同时继续执行标准 COM 和 SendMessage 泵送。”。执行标准 COM 是什么意思? sendMessage抽什么意思?
          • 实际上,这是不正确的。如果你想让Thread1 等到Thread2 结束,你执行Thread2.Join(),而不是Thread1.Join()
          【解决方案5】:

          简单的示例方法:

          public static void Main(string[] args)
          {
              Console.WriteLine("Main thread started.");
          
              var t = new Thread(() => Thread.Sleep(2000));
          
              t.Start();
          
              t.Join();
          
              Console.WriteLine("Thread t finished.");
          }
          

          程序首先在屏幕上打印一条消息,然后启动一个新线程,该线程在终止前暂停 2 秒。最后一条消息仅在t 线程完成执行后打印,因为Join 方法调用会阻塞当前线程,直到t 线程终止。

          【讨论】:

          • 这很简单,但也很无用:一个 Thread.Start 紧跟一个 Thread.Join 破坏了使用第二个线程的整个目的。 (我知道这是一个玩具示例,但仍然......)
          • @Heinzi,它只是按照要求演示了Join 方法的基本行为。它从未打算描绘真实世界的场景。
          【解决方案6】:
          static void Main()
          {
           Thread t = new Thread(new ThreadStart(some delegate here));
           t.Start();
           Console.WriteLine("foo");
           t.Join()
           Console.WriteLine("foo2");
          }
          

          在您的委托中,您将有另一个这样的电话:

          Console.WriteLine("foo3");
          

          输出是:

          foo
          foo3
          foo2
          

          【讨论】:

            【解决方案7】:

            这只是对现有答案的补充,解释了Join 的作用。

            调用Join 还具有允许消息泵处理消息的副作用。有关这可能相关的情况,请参阅此knowledge base article

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-19
              • 2011-09-18
              • 2012-01-10
              • 2011-07-10
              • 2010-10-12
              相关资源
              最近更新 更多