Если у вас установлено значение , а не , позволяющее продолжить цикл до тех пор, пока поток не "запустится", то это будет зависеть от того, что именно вы подразумеваете под "запустил" Означает ли это, что поток был создан ОС и сигнализировал о запуске, но не обязательно, что он сделано еще что-нибудь? Значит ли это, что он выполнил одну или несколько операций?
Хотя это, вероятно, нормально, ваш цикл не является пуленепробиваемым, поскольку теоретически возможно, что весь поток выполняется между временем, когда вы вызываете Start
, и когда вы проверяете ThreadState
; Также не рекомендуется проверять свойство дважды.
Если вы хотите придерживаться проверки состояния, что-то вроде этого будет / может быть более надежным:
ThreadState state = t.ThreadState;
while(state != ThreadState.Runnung && state != ThreadState.WaitSleepJoin)
{
Thread.Sleep(10:
state = t.ThreadState;
}
Однако, это все еще зависит от возможности запуска, запуска и остановки потока, прежде чем вы даже сможете проверить. Да, вы могли бы расширить область действия оператора if
, включив в него другие состояния, но я бы рекомендовал использовать WaitHandle
для сигнализации, когда поток «запускается».
ManualResetEvent signal;
void foo()
{
Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));
signal = new ManualResetEvent();
t.Start(data);
signal.WaitOne();
/* code to execute after the thread has "started" */
}
void ThreadMethod(object foo)
{
signal.Set();
/* do your work */
}
У вас все еще есть возможность завершения потока перед проверкой, но вы гарантированно установите WaitHandle
после запуска потока. Вызов на WaitOne
будет блокироваться на неопределенный срок до тех пор, пока на WaitHandle
.
не будет вызван
Set
.