托管线程状态

更新:2011 年 5 月

Thread.ThreadState 属性提供一个位掩码,用以指示线程的当前状态。 一个线程至少总是处于 ThreadState 枚举中的一个可能状态,并且可以同时处于多个状态。

重要说明重要事项

只有在一些调试方案中才会涉及线程状态。始终不应在代码中使用线程状态来同步线程活动。

在创建托管线程时,该线程处于 ThreadState.Unstarted 状态。 在您调用 Thread.Start 方法前,该线程保持 Unstarted 状态,而调用该方法会将线程转为 Running 状态,以便操作系统可以计划其执行。

进入托管环境的非托管线程已启动。 线程启动后,许多操作都可使线程更改状态。 下表列出使状态发生更改的操作以及相应的新状态。

操作

所得到的新状态

调用 Thread 类的构造函数。

Unstarted

另一个线程对新线程调用 Thread.Start 方法,并且该调用返回。

注意注意
在新线程处于 Running 状态前,Start 方法直不会返回。无法了解在对 Start 的调用期间,何时会发生这种情况。

Running

线程调用 Thread.Sleep

WaitSleepJoin

线程对另一个对象调用 Monitor.Wait

WaitSleepJoin

线程对另一个线程调用 Thread.Join

WaitSleepJoin

另一个线程调用 Thread.Suspend

SuspendRequested

线程响应 Thread.Suspend 请求。

Suspended

另一个线程调用 Thread.Resume

Running

另一个线程调用 Thread.Abort

AbortRequested

线程响应 Thread.Abort

Aborted,然后 Stopped

由于 Running 状态的值为 0,因此无法执行位测试来发现此状态。 但可以使用以下测试(以伪代码表示)。

if ((state & (Unstarted | Stopped)) == 0)   // implies Running   

在任何给定时间,线程通常处于多个状态中。 例如,如果某个线程在 Monitor.Wait 调用被阻止,并且另一个线程对同一个线程调用 Abort,则该线程将同时处于 WaitSleepJoinAbortRequested 状态。 在这种情况下,一旦该线程从对 Wait 的调用返回或该线程中断,它就会收到 ThreadAbortException

一旦线程由于调用 Start 而离开 Unstarted 状态,那么它将无法再返回到 Unstarted 状态。 同样,线程也永远无法离开 Stopped 状态。

请参见

参考

ThreadAbortException

Thread

ThreadState

其他资源

托管线程处理

修订记录

日期

修订记录

原因

2011 年 5 月

进一步阐明 Thread.Start 方法和 Running 状态之间的关系。

客户反馈

2011 年 3 月

阐明了 Thread.Start 方法和 Running 状态之间的关系。

内容 Bug 修复