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