程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#多線程實踐——線程狀態,

C#多線程實踐——線程狀態,

編輯:C#入門知識

C#多線程實踐——線程狀態,


線程狀態關系圖

  在.NET Framework中,可以通過ThreadState屬性獲取線程的執行狀態。上圖標識出三種狀態“層”,ThreadState以按位計算的方式組合狀態層,每種狀態層的成員之間都是互斥的,下面是所有的三種狀態“層”:

  • 運行 (running) / 阻止 (blocking) / 終止 (aborting) 狀態(上圖顯示)
  • 後台 (background) / 前台 (foreground) 狀態 (ThreadState.Background)
  • 不建議使用的Suspend 方法(ThreadState.SuspendRequested 和 ThreadState.Suspended)掛起的過程

        總的來說,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來執行信息。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved