C#中 托管线程的状态

试着画了一个状态图,不一定对

image

一个线程至少总是处于 ThreadState 枚举中的一个可能状态,并且可以同时处于多个状态。进入托管环境的非托管线程已处于已启动状态。 线程在启动状态后,许多操作都可使线程更改状态。 下表列出使状态发生更改的操作以及相应的新状态。

操作

image

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

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

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

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

原文地址:https://www.cnblogs.com/grkin/p/3009637.html