Каково значение Потока. Присоединиться к методу в c#?

Каково значение Потока. Присоединиться к методу в c#?

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

10
задан John Saunders 28 July 2011 в 04:15
поделиться

7 ответов

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.
} 
14
ответ дан 3 December 2019 в 14:43
поделиться

Предположим, у вас есть главный поток, который делегирует часть работы рабочим потокам. Главному потоку нужны некоторые результаты, которые вычисляют рабочие потоки, поэтому он не может продолжить работу, пока все рабочие потоки не завершат ее.

В этом случае главный поток вызовет Join() на каждом из рабочих потоков. После того как все вызовы Join() вернулись, главный поток знает, что все рабочие потоки завершили работу, и что вычисленные результаты доступны для его потребления.

3
ответ дан 3 December 2019 в 14:43
поделиться

Представьте, что ваша программа работает в Thread1. Затем вам нужно начать какие-то вычисления или обработку - вы запускаете другой поток - Thread2. Затем, если вы хотите, чтобы ваш Thread1 дождался окончания Thread2, вы выполняете Thread1.Join(); и Thread1 не будет продолжать свое выполнение, пока Thread2 не завершится.

Вот описание в MSDN.

3
ответ дан 3 December 2019 в 14:43
поделиться

Это просто дополнение к существующим ответам, которые объясняют, что делает Join.

Вызов Join также имеет побочный эффект, позволяя насосу сообщений обрабатывать сообщения. См. статью базы знаний о ситуациях, в которых это может быть актуально.

0
ответ дан 3 December 2019 в 14:43
поделиться
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
1
ответ дан 3 December 2019 в 14:43
поделиться

Простой пример подхода:

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

3
ответ дан 3 December 2019 в 14:43
поделиться
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);
8
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: