国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C#多線程實(shí)踐——線程狀態(tài)

2019-11-17 02:22:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

C#多線程實(shí)踐——線程狀態(tài)

線程狀態(tài)關(guān)系圖

  在.NET Framework中,可以通過(guò)ThreadState屬性獲取線程的執(zhí)行狀態(tài)。上圖標(biāo)識(shí)出三種狀態(tài)“層”,ThreadState以按位計(jì)算的方式組合狀態(tài)層,每種狀態(tài)層的成員之間都是互斥的,下面是所有的三種狀態(tài)“層”:

  • 運(yùn)行 (running) / 阻止 (blocking) / 終止 (aborting) 狀態(tài)(上圖顯示)
  • 后臺(tái) (background) / 前臺(tái) (foreground) 狀態(tài) (ThreadState.Background)
  • 不建議使用的Suspend方法(ThreadState.SuspendRequested 和 ThreadState.Suspended)掛起的過(guò)程

總的來(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í)行信息。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 当阳市| 枞阳县| 祁门县| 施秉县| 安宁市| 图们市| 台东县| 阆中市| 休宁县| 社旗县| 新密市| 安徽省| 常熟市| 柳河县| 旅游| 乐都县| 岳阳市| 太湖县| 万盛区| 崇阳县| 于都县| 昌黎县| 佳木斯市| 子洲县| 广河县| 淳安县| 凯里市| 聂荣县| 浙江省| 商水县| 武胜县| 富川| 读书| 昌黎县| 太保市| 肇东市| 扎赉特旗| 西盟| 荆门市| 西乡县| 鄂托克前旗|