2011-01-20 2 views
0

Из того, что я читал об этом .Join(), кажется, дождался, что этот вопрос будет выполнен с его операциями, прежде чем присоединяться и двигаться дальше с основным кодом. Однако, насколько я могу судить, когда мой код застревает в .Join(), этот поток больше не работает и, похоже, уже закрыт. Последней строкой кода, которая попадает в рассматриваемый поток, является this.Close(). Любые идеи, что происходит и как это исправить?Почему мой код застрял в Form2Thread.Join()?

Это исполняемая программа на C#, работающая на ручном устройстве Windows CE.

Возможно, я также должен добавить, что это периодическая проблема, которая не всегда происходит.

Это нити начинают:

//Start the thread to continuously receive while the LP dialog is open 
Thread Form2Thread = new Thread(new ThreadStart(this.Nep450_ThreadLowPower)); 

Это код непосредственно перед .join():

else if (Form2.g_IsOKPressed)//This variable is set in the thread in qustionFomr 
         {       
          g_bThreadLowPowerTerminate = true; 
          Thread.Sleep(500); 
          Form2Thread.Join(); 

Я нашел источник проблемы. Следующая строка была удалена и вызвала проблему, когда код был запущен во второй раз. Как только я удалил его, проблем больше не было.

this.Invoke(new EventHandler(CloseLPDialog)); 
+0

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

ответ

1

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

Показать эту функцию.Nep450_ThreadLowPower. Там должен быть стек причины

+0

То, что я делаю сейчас, я попытался уловить попытку, но это не позволило мне погладить по какой-то причине. – Bryan

+0

Где вы добавляете try-catch? Что не дает вам возможности сделать это? И что это делает.Close()? Может быть, потоком является стек в этом методе? и что такое класс Form2Thread? –

+0

И я получил попытку поймать на работу, я, очевидно, пытался поставить ее в неправильное место. This.Close() находится в потоке и предназначен для закрытия, как только этот код будет запущен. – Bryan

0

Было бы хорошую практику, чтобы проверить состояние потока перед вызовом Join():

if (aThread.ThreadState == ThreadState.Running) 
{ 

    aThread.Join(); 

} 

EDIT: Теперь, когда вы опубликовали пример кода, я думаю, вы должны проверить если вам действительно нужен вызов Thread.Sleep (500).

EDIT # 2: Исправлен вышеуказанный код.

+0

И у меня нет возможности .Threadstate.Running – Bryan

+0

Что именно происходит в вашей теме? Возможно ли это в состоянии WaitSleepJoin? –

+0

Не должно быть, самое длинное время ожидания thread.sleep составляет 2 секунды.И когда я перехожу к коду для потока, я не могу видеть никаких значений для любой из переменных или ударять любые точки останова, которые, как я предполагаю, означает, что поток закрыт. – Bryan