2013-03-27 2 views
0

Некоторое время я использовал поток в своей программе, но никогда не использовал join(). я получил что-то о присоединении(), как показано нижеОсновной запрос об использовании Thread & join C#

Join will stop the current running thread and let the "Join" thread runs until it finishes. 

static void Main() 
{ 
    Thread t = new Thread (Go); 
    t.Start(); 
    t.Join(); 
    Console.WriteLine ("Thread t has ended!"); 
} 

static void Go() 
{ 
    for (int i = 0; i < 10; i++) Console.Write ("y"); 
} 

из приведенного выше кода, я просто не понимаю, какую важную роль объединения() играет здесь. пожалуйста, обсудите вопрос об использовании соединения.

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

также руководство me join() может использоваться в многопоточной среде. спасибо

+0

Пример кода вы вывесили в порядке. Вы выполнили код или использовали отладчик? – Dai

+0

'Некоторое время я использовал поток в своей программе, но я никогда не использовал join()' - хорошо, продолжайте его :) –

+0

't.Join()' в основном означает 'ждать здесь, пока t не закончит свою работу'. Это необходимо, особенно если вам нужно получить результат потока ** до **, вы можете продолжить. Например, вы можете завершить обработку ** всех ** данных **, прежде чем ** фактически сохранить данные. – Nolonar

ответ

2

Если вы удалите t.Join() из вашего приложения кода, он завершит выполнение, прежде чем вы сможете убедиться, что метод Go() выполнен.

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

Пожалуйста, смотрите ниже код:

static void Main(string[] args) 
     { 
     Thread t1 = new Thread(Method1); 
     Thread t2 = new Thread(Method2); 
     t1.Start(); 
     t2.Start(); 
     Console.WriteLine("Both methods are executed independently now"); 
     t1.Join(); // wait for thread 1 to complete 
     t2.Join(); // wait for thread 2 to complete 
     Console.WriteLine("both methods have completed"); 
     Method3(); // using results from thread 1 and thread 2 we can execute method3 that can use results from Method1 and Method2 

     } 
+0

, если мне нужно запустить Method1 & Method2 одновременно, то мне нужно написать код, но мертвая блокировка не должна произойти. – Thomas

+0

@Thomas, если Method1 и Method2 обращаются к тем же данным (объектам, переменным и т. Д.), Вам необходимо синхронизировать доступ к этим данным. Пожалуйста, прочитайте эту ссылку (ключевое слово блокировки) http://msdn.microsoft.com/en-gb/library/ms173179(v=vs.80).aspx –

0

.Join() вызов ждет, пока нить не закончится. Я имею в виду, что этот вызов вернется, когда вернется метод Go.

2

Блокирует вызывающую нить до окончания потока.

Примечание. Вы также можете блокировать вызывающий поток до тех пор, пока поток не завершится или указанное время не истечет, продолжая выполнять стандартную пересылку COM и SendMessage. Поддерживается. NET Compact Framework.

ссылка: http://msdn.microsoft.com/fr-fr/library/system.threading.thread.join(v=vs.80).aspx

2

Рассмотрим некоторые игры пример.

static void Main() 
{ 
    Thread t = new Thread (LoadMenu); 
    t.Start(); 
    Showadvertisement(); 
    t.Join(); 
    ShowMenu(); 
} 

static void LoadMenu() 
{ 
    //loads menu from disk, unzip textures, online update check. 
} 

static void Showadvertisement() 
{ 
    //Show the big nvidia/your company logo fro 5 seconds 
} 

static void ShowMenu() 
{ 
    //everithing is already loaded. 
} 

Дело в том, что вы можете сделать несколько вещей в две нити, но в какой-то момент вы должны синхронизировать их и быть уверенным, что все Allready завершено

3

Используя код размещен в качестве примера, если он были написаны так:

static void Main() 
{ 
    Thread t = new Thread (Go); 
    t.Start(); 
    Console.WriteLine ("Thread t has ended!"); 
} 

static void Go() 
{ 
    for (int i = 0; i < 10; i++) Console.Write ("y"); 
} 

ваш выход будет что-то вдоль линий:

ууу Thread т га s закончился! YYYYYYY

означает Go() прогонов одновременно с Console.WriteLine ("Thread t has ended!");

Добавляя t.join(), вы будете ждать, пока ваш поток завершается, прежде чем продолжить. Это полезно, если вы хотите, чтобы часть вашего кода запускалась одновременно с потоком.

+0

Ну, выход из 'Go' не обязательно должен быть завершен, так как программа может быть закончена раньше ... –

+0

поэтому u означает, что t.join() заставит ждать главный поток, пока не закончится другой поток .... am i правильно? – Thomas

+0

@ Томас да, более или менее. 't.Join()' заставит основной поток ждать до тех пор, пока не будет завершен какой-либо «Thread t». –

Смежные вопросы