Почему мой код застрял в Form2Thread.Join ()? - PullRequest
0 голосов
/ 20 января 2011

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

Это исполняемая программа 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));

Ответы [ 2 ]

1 голос
/ 20 января 2011

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

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

0 голосов
/ 20 января 2011

Хорошей практикой будет проверка состояния потока перед вызовом Join ():

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

    aThread.Join();

}

РЕДАКТИРОВАТЬ: Теперь, когда вы опубликовали пример кода, я думаю, вам следует проверить, действительно ли вам нужен вызов Thread.Sleep (500).

РЕДАКТИРОВАТЬ # 2: Исправлен код выше.

...