Каково значение Потока. Присоединиться к методу в c#?
MSDN заявляет, что блокирует вызывающий поток, пока поток не завершается. Кто-либо может объяснить это с простым примером?
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.
}
Предположим, у вас есть главный поток, который делегирует часть работы рабочим потокам. Главному потоку нужны некоторые результаты, которые вычисляют рабочие потоки, поэтому он не может продолжить работу, пока все рабочие потоки не завершат ее.
В этом случае главный поток вызовет Join()
на каждом из рабочих потоков. После того как все вызовы Join()
вернулись, главный поток знает, что все рабочие потоки завершили работу, и что вычисленные результаты доступны для его потребления.
Представьте, что ваша программа работает в Thread1
. Затем вам нужно начать какие-то вычисления или обработку - вы запускаете другой поток - Thread2
. Затем, если вы хотите, чтобы ваш Thread1 дождался окончания Thread2
, вы выполняете Thread1.Join();
и Thread1
не будет продолжать свое выполнение, пока Thread2
не завершится.
Вот описание в MSDN.
Это просто дополнение к существующим ответам, которые объясняют, что делает Join
.
Вызов Join
также имеет побочный эффект, позволяя насосу сообщений обрабатывать сообщения. См. статью базы знаний о ситуациях, в которых это может быть актуально.
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
Простой пример подхода:
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
не завершится.
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);