Zustände von verwalteten Threads
Durch die Thread.ThreadState-Eigenschaft wird eine Bitmaske bereitgestellt, die den aktuellen Zustand des Threads angibt. Ein Thread befindet sich stets in mindestens einem der möglichen Zustände der ThreadState-Enumeration. Er kann sich aber auch gleichzeitig in mehreren Zuständen befinden.
Wichtig |
---|
Der Threadzustand ist nur in einigen Debugszenarios von Interesse.Der Code sollte die Aktivitäten von Threads nie anhand des Threadzustands synchronisieren. |
Wenn Sie einen verwalteten Thread erstellen, weist er den Zustand ThreadState.Unstarted auf. Der Thread verbleibt im Zustand Unstarted, bis Sie die Thread.Start-Methode aufrufen, die den Thread in den Zustand Running versetzt, sodass das Betriebssystem seine Ausführung planen kann.
Nicht verwaltete Threads, die in die verwaltete Umgebung eintreten, wurden bereits gestartet. Nach dem Starten eines Threads kann sein Zustand durch eine Reihe von Aktionen geändert werden. In der folgenden Tabelle werden die Aktionen aufgelistet, die eine solche Änderung hervorrufen, sowie die entsprechenden neuen Zustände.
Aktion |
Neuer Zustand |
---|---|
Der Konstruktor für die Thread-Klasse wird aufgerufen. |
|
Ein anderer Thread ruft die Thread.Start-Methode für den neuen Thread auf, und der Aufruf kehrt zurück. |
|
Ein weiterer Thread ruft Thread.Sleep auf. |
|
Der Thread ruft Monitor.Wait für ein anderes Objekt auf. |
|
Der Thread ruft Thread.Join für einen anderen Thread auf. |
|
Ein anderer Thread ruft Thread.Suspend auf. |
|
Der Thread reagiert auf eine Thread.Suspend-Anforderung. |
|
Ein anderer Thread ruft Thread.Resume auf. |
|
Ein anderer Thread ruft Thread.Abort auf. |
|
Der Thread reagiert auf ein Thread.Abort. |
Da der Zustand Running den Wert 0 (null) hat, kann kein Bittest zur Ermittlung dieses Zustands durchgeführt werden. Stattdessen kann der folgende Test (in Pseudocode) verwendet werden:
if ((state & (Unstarted | Stopped)) == 0) // implies Running
Threads befinden sich oft in mehreren Zuständen gleichzeitig. Wenn beispielsweise ein Thread in einem Monitor.Wait-Aufruf blockiert ist und ein anderer Thread Abort für diesen Thread aufruft, befindet er sich gleichzeitig im Zustand WaitSleepJoin und im Zustand AbortRequested. In diesem Fall empfängt der Thread ThreadAbortException, sobald er vom Aufruf von Wait zurückkehrt oder unterbrochen wird.
Wenn ein Thread durch den Aufruf von Start den Zustand Unstarted verlassen hat, kann er nicht mehr in den Zustand Unstarted zurückkehren. Ein Thread kann niemals den Zustand Stopped verlassen.
Siehe auch
Referenz
Weitere Ressourcen
Änderungsprotokoll
Datum |
Versionsgeschichte |
Grund |
---|---|---|
Mai 2011 |
Die Beziehung zwischen der Thread.Start-Methode und dem Zustand Running wurde genauer beschrieben. |
Kundenfeedback. |
März 2011 |
Die Beziehung zwischen der Thread.Start-Methode und dem Zustand Running wurde genauer beschrieben. |
Korrektur inhaltlicher Fehler. |