托管线程状态
更新:2007 年 11 月
Thread.ThreadState 属性提供一个位掩码,用以指示线程的当前状态。一个线程至少总是处于 ThreadState 枚举中的一个可能状态,并且可以同时处于多个状态。
重要说明: |
---|
只有在一些调试方案中才会涉及线程状态。始终不应在代码中使用线程状态来同步线程活动。 |
在创建托管线程时,该线程处于 Unstarted 状态。线程会保持 Unstarted 状态,直到被操作系统转移到已启动状态。调用 Start 使操作系统知道该线程可启动,它不更改线程的状态。
进入托管环境的非托管线程已处于已启动状态。一旦处于已启动状态中,就可以执行许多操作来使线程更改状态。下表列出使状态发生更改的操作以及相应的新状态。
操作 |
所得到的新状态 |
---|---|
另一个线程调用 Thread.Start。 |
Unchanged |
线程响应 Thread.Start 并开始运行。 |
|
线程调用 Thread.Sleep。 |
|
线程对另一个对象调用 Monitor.Wait。 |
|
线程对另一个线程调用 Thread.Join。 |
|
另一个线程调用 Thread.Suspend。 |
|
线程响应 Thread.Suspend 请求。 |
|
另一个线程调用 Thread.Resume。 |
|
另一个线程调用 Thread.Suspend。 |
|
另一个线程调用 Thread.Abort。 |
|
线程响应 Thread.Abort。 |
由于 Running 状态的值为 0,因此不可能执行位测试来发现此状态。但可以使用以下测试(以伪代码表示)。
if ((state & (Unstarted | Stopped)) == 0) // implies Running
在任何给定时间,线程通常处于多个状态中。例如,如果某个线程在 Monitor.Wait 调用被阻止并且另一个线程调用该线程上的 Abort,则该线程将同时处于 WaitSleepJoin 和 AbortRequested 状态。在这种情况下,一旦该线程从对 Wait 的调用返回或该线程中断,它就会收到 ThreadAbortException。
一旦线程由于调用 Start 而离开 Unstarted 状态,那么它将无法再返回到 Unstarted 状态。同样,线程也永远无法离开 Stopped 状态。