托管线程状态

更新:2007 年 11 月

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

重要说明:

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

在创建托管线程时,该线程处于 Unstarted 状态。线程会保持 Unstarted 状态,直到被操作系统转移到已启动状态。调用 Start 使操作系统知道该线程可启动,它不更改线程的状态。

进入托管环境的非托管线程已处于已启动状态。一旦处于已启动状态中,就可以执行许多操作来使线程更改状态。下表列出使状态发生更改的操作以及相应的新状态。

操作

所得到的新状态

另一个线程调用 Thread.Start

Unchanged

线程响应 Thread.Start 并开始运行。

Running

线程调用 Thread.Sleep

WaitSleepJoin

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

WaitSleepJoin

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

WaitSleepJoin

另一个线程调用 Thread.Suspend

SuspendRequested

线程响应 Thread.Suspend 请求。

Suspended

另一个线程调用 Thread.Resume

Running

另一个线程调用 Thread.Suspend

Running

另一个线程调用 Thread.Abort

AbortRequested

线程响应 Thread.Abort

Aborted

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

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

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

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

请参见

参考

ThreadAbortException

Thread

ThreadState

其他资源

托管线程处理