Managed 執行緒狀態
更新:2007 年 11 月
Thread.ThreadState 屬性提供指示執行緒目前狀態的位元遮罩。執行緒一定處於 ThreadState 列舉型別中至少一種可能的狀態下,並且可能同時處於多種狀態。
重要事項: |
---|
執行緒狀態只有在少數偵錯案例中會用到。絕對不要在您的程式碼中使用執行緒狀態來同步執行緒活動。 |
當您建立 Managed 執行緒時,它是處於 Unstarted 狀態。此執行緒會維持 Unstarted 狀態,直到它被作業系統移至啟動狀態為止。呼叫 Start 可讓作業系統知道執行緒可以啟動了,它不會變更執行緒的狀態。
進入 Managed 環境的 Unmanaged 執行緒已處於啟動狀態。一旦處於啟動狀態,就會有數個動作可引發執行緒變更狀態。下列表格列出引發變更狀態的動作,以及對應的新狀態。
動作 |
產生的新狀態 |
---|---|
另一個執行緒會呼叫 Thread.Start。 |
未變更 |
執行緒回應 Thread.Start 並開始執行。 |
|
執行緒會呼叫 Thread.Sleep。 |
|
執行緒呼叫另一個物件上的 Monitor.Wait。 |
|
執行緒呼叫另一個執行緒上的 Thread.Join。 |
|
另一個執行緒會呼叫 Thread.Suspend。 |
|
執行緒回應 Thread.Suspend 要求。 |
|
另一個執行緒會呼叫 Thread.Resume。 |
|
另一個執行緒會呼叫 Thread.Suspend。 |
|
另一個執行緒會呼叫 Thread.Abort。 |
|
執行緒回應 Thread.Abort。 |
因為 Running 狀態的值為 0,所以無法執行位元測試來探索 (Discover) 這個狀態。而是可使用下列測試 (虛擬程式碼):
if ((state & (Unstarted | Stopped)) == 0) // implies Running
在任何指定的時間內,執行緒通常處於一種以上的狀態內。例如,如果執行緒被封鎖,無法進行 Monitor.Wait 呼叫,且另一個執行緒呼叫位於同一執行緒上的 Abort,則執行緒會同時處於 WaitSleepJoin 和 AbortRequested 狀態。在這個情況下,只要執行緒從Wait 的呼叫返回或被中斷,就會收到 ThreadAbortException。
一旦執行緒因呼叫 Start 而離開 Unstarted 狀態,就不會再回到 Unstarted 狀態。執行緒絕不能離開 Stopped 狀態。