Каково значение метода Thread.Join в С#?

Каково значение метода Thread.Join в С#?

MSDN говорит, что он блокирует вызывающий поток до тех пор, пока поток не завершится. Кто-нибудь может объяснить это простым примером?

Ответ 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.

Ответ 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 не завершится.

Ответ 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 также имеет побочный эффект, позволяющий насосу сообщений обрабатывать сообщения. См. Эту статью статью базы знаний для ситуаций, когда это может иметь значение.