如果你在不让你的循环继续下去,直到该线程已经“开始”,那么它将取决于究竟你意思设置为“已启动”。这是否意味着该线程已经由操作系统创建并发出信号运行,但不一定是完成了什么?这是否意味着它执行了一个或多个操作?
虽然这很可能没有问题,但是您的循环并非无懈可击,因为理论上可能在您拨打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
将无限期阻止,直到Set
已被呼叫WaitHandle
。
谢谢!我喜欢这个想法,并且......这个例子! – Martin 2010-02-08 20:51:12