
在.NET Framework中,可以通過(guò)ThreadState屬性獲取線程的執(zhí)行狀態(tài)。上圖標(biāo)識(shí)出三種狀態(tài)“層”,ThreadState以按位計(jì)算的方式組合狀態(tài)層,每種狀態(tài)層的成員之間都是互斥的,下面是所有的三種狀態(tài)“層”:
總的來(lái)說(shuō),ThreadState是按位組合零或每個(gè)狀態(tài)層的成員!一個(gè)簡(jiǎn)單的ThreadState示例如下:
Unstarted
Running
WaitSleepJoin
Background, Unstarted
SuspendRequested, Background, WaitSleepJoin
這些枚舉的成員中StoPRequested 和 Aborted兩個(gè)從來(lái)沒(méi)被用過(guò),至少當(dāng)前CLR實(shí)現(xiàn)上每月使用過(guò)。
另外,ThreadState.Running潛在的值為0 ,因此代碼不會(huì)被執(zhí)行:
if ((t.ThreadState & ThreadState.Running) > 0) ...
這種情況下,需要使用線程的IsAlive屬性來(lái)代替按位與非操作符。不過(guò)IsAlive的結(jié)果可能不是想要的,因?yàn)榫€程在在被阻止或掛起的時(shí)候也會(huì)返回true(只有在線程未開始或已正常結(jié)束時(shí)它才為false)。
避開不推薦使用的Suspend 和 Resume方法,可以寫一個(gè)helper方法除去所有除了第一種狀態(tài)層的成員。線程的后臺(tái)狀態(tài)可以通過(guò)IsBackground 獲得,所以實(shí)際上只有第一種狀態(tài)層擁有有用的信息。
public static ThreadState SimpleThreadState (ThreadState ts) { return ts & (ThreadState.Aborted | ThreadState.AbortRequested | ThreadState.Stopped | ThreadState.Unstarted | ThreadState.WaitSleepJoin);}ThreadState對(duì)調(diào)試或程序概要分析很重要,不過(guò)在多線程協(xié)同的情況下就沒(méi)這么方便了,因?yàn)闆](méi)有一個(gè)可靠的機(jī)制可以不考慮ThreadState的變化而僅通過(guò)判斷ThreadState來(lái)執(zhí)行信息。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注