2009-10-12 3 views
3

Я пытаюсь получить хорошее понимание многопоточности в C#, и я немного смущен о применимости метода Thread.Join. Microsoft говорит, что это «Блокирует вызывающий поток до тех пор, пока поток не завершится». Два вопроса:C# Присоединение потоков

  1. В нижеследующем примере, какой поток фактически заблокирован, а другой работает к завершению?

  2. Не факт, что один поток заблокирован, а другой выполняет к завершению, фактически лишает цель многопоточности? (Таким образом, я предполагаю, что вы хотите только присоединиться в определенных ситуациях. Что может быть те?)

static int Main() 
    { 
     Alpha oAlpha = new Alpha(); 
     Thread oThread = new Thread(new ThreadStart(oAlpha.Beta)); 
     oThread.Start(); 
     oThread.Join(); 
    } 

Следует также отметить, что это вполне возможно, что я не делаю что-то правильное Вот.

+1

Блестящая статья, которая должна помочь - http://www.albahari.com/threading/ – PostMan

+0

Ха-ха, спасибо. Я видел это, но только после того, как начались ответы. Я на самом деле собирался начать читать. – LJM

ответ

3

Main заблокирован до oThread Выполняется.

Идея состоит в том, что вы можете закончить на поток чисто и дождаться, когда он очистится после себя, а не убить нить sloppily.

Он также полезен для запуска партии из трех или четырех независимых процессов, а затем продолжается, как только ВСЕ их завершатся.

+1

Таким образом, в этом упрощенном примере удаление соединения может привести к тому, что текущий поток (который работает main) не пройдет до конца метода до того, как закончится oThread, тем самым убив oThread и оставив его в плохом состоянии. Если это правильно, я предполагаю, что если исходный поток завершается, то oThread также прекращается. Верный? – LJM

+0

Всё зависит. Если поток задан как поток «Background», то да, именно так оно и будет работать. Если для этого свойства установлено значение false, он будет продолжать процесс до тех пор, пока он не завершится. –

0
  1. нить, которая работает с блоками метода Main().

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

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