更新:2011 年 5 月
Thread.ThreadState 属性提供一个位掩码,用以指示线程的当前状态。 一个线程至少总是处于 ThreadState 枚举中的一个可能状态,并且可以同时处于多个状态。
| .gif) 重要事项 | 
|---|
| 只有在一些调试方案中才会涉及线程状态。始终不应在代码中使用线程状态来同步线程活动。 | 
在创建托管线程时,该线程处于 ThreadState.Unstarted 状态。 在您调用 Thread.Start 方法前,该线程保持 Unstarted 状态,而调用该方法会将线程转为 Running 状态,以便操作系统可以计划其执行。
进入托管环境的非托管线程已启动。 线程启动后,许多操作都可使线程更改状态。 下表列出使状态发生更改的操作以及相应的新状态。
| 操作 | 所得到的新状态 | 
|---|---|
| 调用 Thread 类的构造函数。 | |
| 另一个线程对新线程调用 Thread.Start 方法,并且该调用返回。 | |
| 线程调用 Thread.Sleep。 | |
| 线程对另一个对象调用 Monitor.Wait。 | |
| 线程对另一个线程调用 Thread.Join。 | |
| 另一个线程调用 Thread.Suspend。 | |
| 线程响应 Thread.Suspend 请求。 | |
| 另一个线程调用 Thread.Resume。 | |
| 另一个线程调用 Thread.Abort。 | |
| 线程响应 Thread.Abort。 | 
由于 Running 状态的值为 0,因此无法执行位测试来发现此状态。 但可以使用以下测试(以伪代码表示)。
if ((state & (Unstarted | Stopped)) == 0)   // implies Running   
在任何给定时间,线程通常处于多个状态中。 例如,如果某个线程在 Monitor.Wait 调用被阻止,并且另一个线程对同一个线程调用 Abort,则该线程将同时处于 WaitSleepJoin 和 AbortRequested 状态。 在这种情况下,一旦该线程从对 Wait 的调用返回或该线程中断,它就会收到 ThreadAbortException。
一旦线程由于调用 Start 而离开 Unstarted 状态,那么它将无法再返回到 Unstarted 状态。 同样,线程也永远无法离开 Stopped 状态。
请参见
参考
其他资源
修订记录
| 日期 | 修订记录 | 原因 | 
|---|---|---|
| 2011 年 5 月 | 进一步阐明 Thread.Start 方法和 Running 状态之间的关系。 | 客户反馈 | 
| 2011 年 3 月 | 阐明了 Thread.Start 方法和 Running 状态之间的关系。 | 内容 Bug 修复 | 
.gif) 注意
注意