在.NET Framework中,可以通過ThreadState屬性獲取線程的執行狀態。上圖標識出三種狀態“層”,ThreadState以按位計算的方式組合狀態層,每種狀態層的成員之間都是互斥的,下面是所有的三種狀態“層”:
總的來說,ThreadState是按位組合零或每個狀態層的成員!一個簡單的ThreadState示例如下:
Unstarted
Running
WaitSleepJoin
Background, Unstarted
SuspendRequested, Background, WaitSleepJoin
這些枚舉的成員中StopRequested 和 Aborted兩個從來沒被用過,至少當前CLR實現上每月使用過。
另外,ThreadState.Running潛在的值為0 ,因此代碼不會被執行:
if ((t.ThreadState & ThreadState.Running) > 0) ...
這種情況下,需要使用線程的IsAlive屬性來代替按位與非操作符。不過IsAlive的結果可能不是想要的,因為線程在在被阻止或掛起的時候也會返回true(只有在線程未開始或已正常結束時它才為false)。
避開不推薦使用的Suspend 和 Resume方法,可以寫一個helper方法除去所有除了第一種狀態層的成員。線程的後台狀態可以通過IsBackground 獲得,所以實際上只有第一種狀態層擁有有用的信息。
public static ThreadState SimpleThreadState (ThreadState ts) { return ts & (ThreadState.Aborted | ThreadState.AbortRequested | ThreadState.Stopped | ThreadState.Unstarted | ThreadState.WaitSleepJoin); }
ThreadState對調試或程序概要分析很重要,不過在多線程協同的情況下就沒這麼方便了,因為沒有一個可靠的機制可以不考慮ThreadState的變化而僅通過判斷ThreadState來執行信息。