共用方式為


Managed 執行緒狀態

更新:2011 年 5 月

Thread.ThreadState 屬性提供指示執行緒目前狀態的位元遮罩。 執行緒一定處於 ThreadState 列舉型別中至少一種可能的狀態下,並且可能同時處於多種狀態。

重要事項重要事項

執行緒狀態只有在少數偵錯案例中會用到。絕對不要在您的程式碼中使用執行緒狀態來同步執行緒活動。

當您建立 Managed 執行緒時,它是處於 ThreadState.Unstarted 狀態。 執行緒會維持 Unstarted 狀態,直到您呼叫 Thread.Start 方法為止,這樣會讓執行緒進入 Running 狀態,如此作業系統就能夠排程其執行時間。

進入 Managed 環境的 Unmanaged 執行緒已啟動。 一旦執行緒啟動,就會有數個動作可能導致其變更狀態。 下列表格列出引發變更狀態的動作,以及對應的新狀態。

動作

產生的新狀態

會呼叫 Thread 類別的建構函式。

Unstarted

另一個執行緒會呼叫新執行緒上的 Thread.Start 方法,然後呼叫就會傳回。

注意事項注意事項
Start 方法會在新執行緒進入 Running 狀態後才傳回。您無法得知在呼叫 Start 期間,何時會發生這種情況。

Running

執行緒會呼叫 Thread.Sleep

WaitSleepJoin

執行緒呼叫另一個物件上的 Monitor.Wait

WaitSleepJoin

執行緒呼叫另一個執行緒上的 Thread.Join

WaitSleepJoin

另一個執行緒會呼叫 Thread.Suspend

SuspendRequested

執行緒回應 Thread.Suspend 要求。

Suspended

另一個執行緒會呼叫 Thread.Resume

Running

另一個執行緒會呼叫 Thread.Abort

AbortRequested

執行緒回應 Thread.Abort

Aborted,再 Stopped

由於 Running 狀態的值為 0,因此無法執行位元測試來探索 (Discover) 這個狀態。 而是可使用下列測試 (虛擬程式碼):

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

在任何指定的時間內,執行緒通常處於一種以上的狀態內。 例如,如果執行緒遭到封鎖,無法進行 Monitor.Wait 呼叫,且另一個執行緒呼叫位於同一執行緒上的 Abort,則執行緒會同時處於 WaitSleepJoinAbortRequested 狀態。 在這個情況下,只要執行緒從Wait 的呼叫返回或被中斷,就會收到 ThreadAbortException

一旦執行緒因呼叫 Start 而離開 Unstarted 狀態,就不會再回到 Unstarted 狀態。 執行緒絕不能離開 Stopped 狀態。

請參閱

參考

ThreadAbortException

Thread

ThreadState

其他資源

Managed 執行緒處理

變更記錄

日期

記錄

原因

2011 年 5 月

進一步釐清 Thread.Start 方法和 Running 狀態之間的關聯性。

客戶回函。

2011 年 3 月

已釐清 Thread.Start 方法和 Running 狀態之間的關聯性。

內容 Bug 修正。