ThreadState は、スレッドに指定できるすべての実行状態のセットを定義します。スレッドは、作成されてから終了するまでの間に、少なくとも 1 つの状態になります。共通言語ランタイム内で作成されたスレッドの初期状態は Unstarted です。一方、ランタイムに外部から入ってきたスレッドは既に Running 状態になっています。Unstarted スレッドは、Start を呼び出すと、Running 状態に移行します。ThreadState 値の組み合わせがすべて有効とは限りません。たとえば、同時に Aborted 状態と Unstarted 状態になることはありません。
重要 : |
|---|
スレッド状態の列挙体には、System.Threading..::.ThreadState と System.Diagnostics..::.ThreadState の 2 つがあります。スレッド状態の列挙体は、デバッグを行う場合に必要になることがあります。コードでは、スレッド状態を使用して、スレッドの動作を同期しないでください。 |
状態が変更される原因となるアクションを次の表に示します。
アクション | ThreadState |
|---|
スレッドを共通言語ランタイム内で作成する。 | Unstarted |
スレッドによる Start の呼び出し。 | Unstarted |
スレッドによる実行の開始。 | Running |
Sleep の呼び出し。 | WaitSleepJoin |
スレッドによる、別のオブジェクト上での Wait の呼び出し。 | WaitSleepJoin |
スレッドによる、別のスレッド上での Join の呼び出し。 | WaitSleepJoin |
別のスレッドによる Interrupt の呼び出し。 | Running |
別のスレッドによる Suspend の呼び出し。 | SuspendRequested |
スレッドが Suspend 要求に応答する。 | Suspended |
別のスレッドによる Resume の呼び出し。 | Running |
別のスレッドによる Abort の呼び出し。 | AbortRequested |
スレッドが Abort 要求に応答する。 | Stopped |
スレッドの終了。 | Stopped |
上に示した状態の他に、Background 状態もあります。これは、スレッドがバックグランドとフォアグラウンドのどちらで実行されているかどうかを示す状態です。
スレッドは特定の場合に複数の状態になることがあります。たとえば、スレッドが Wait を呼び出してブロックされ、別のスレッドがそのブロックされたスレッドで Abort を呼び出すと、スレッドは同時に WaitSleepJoin の状態と AbortRequested の状態になります。この場合は、スレッドが Wait の呼び出しから戻る、または中断されるとすぐに ThreadAbortException を受け取り、アボートを開始します。
スレッドの Thread..::.ThreadState プロパティは、スレッドの現在の状態を提供します。アプリケーションは、ビットマスクを使用してスレッドが実行中かどうかを判断する必要があります。Running の値が 0 である場合は、C# コード ((myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0 など) または Visual Basic コード ((myThread.ThreadState And (ThreadState.Stopped Or ThreadState.Unstarted)) = 0 など) を使用してスレッドが実行中かどうかをテストします。