Anhalten und Fortsetzen von Threads
Aktualisiert: November 2007
Die häufigsten Vorgehensweisen zum Synchronisieren der Aktivitäten von Threads bestehen darin, Threads zu blockieren und freizugeben bzw. Objekte oder Codebereiche zu sperren. Weitere Informationen zu diesen Sperr- und Blockierungsmechanismen finden Sie unter Übersicht über Synchronisierungsprimitiven.
Sie können auch vorsehen, dass Threads sich selbst deaktivieren. Wenn Threads blockiert oder deaktiviert sind, können Sie sie mit ThreadInterruptedException wieder aus ihrem Wartezustand holen.
Die Thread.Sleep-Methode
Durch den Aufruf der Thread.Sleep-Methode wird der aktuelle Thread sofort für die Dauer der Übergabe (in Millisekunden) an Thread.Sleep blockiert. Dabei wird der restliche Zeitanteil dieses Threads einem anderen Thread zur Verfügung gestellt. Ein Thread kann Thread.Sleep nicht für einen anderen Thread aufrufen.
Durch den Aufruf von Thread.Sleep mit Timeout.Infinite bleibt ein Thread so lange deaktiviert, bis er unterbrochen wird, indem ein anderer Thread Thread.Interrupt aufruft, oder bis er durch Thread.Abort beendet wird.
Unterbrechen von Threads
Ein Thread in Warteposition kann durch den Aufruf von Thread.Interrupt für den blockierten Thread unterbrochen werden, um ThreadInterruptedException auszulösen. Dadurch wird der Thread aus dem blockierenden Aufruf herausgelöst. Der Thread sollte ThreadInterruptedException abfangen und die angemessenen Schritte zum Fortsetzen der Arbeit durchführen. Wenn der Thread die Ausnahme ignoriert, wird diese durch die Common Language Runtime abgefangen und der Thread gestoppt.
![]() |
---|
Ist der Zielthread beim Aufruf von Thread.Interrupt nicht blockiert, muss er zuerst blockiert werden, bevor er unterbrochen werden kann. Wenn der Thread nie blockiert wird, kann er ohne jegliche Unterbrechung abgeschlossen werden. |
Befindet sich ein Thread in einem verwalteten Wartezustand, kann er durch Thread.Interrupt und Thread.Abort sofort aktiviert werden. Bei nicht verwalteten Wartezuständen (z. B. bei einem Plattformaufruf der Win32-WaitForSingleObject-Funktion) kann weder Thread.Interrupt noch Thread.Abort die Steuerung des Threads übernehmen, bis dieser zu verwaltetem Code zurückkehrt oder einen Aufruf in verwaltetem Code ausführt. In verwaltetem Code wird folgendes Verhalten beobachtet:
Thread.Interrupt aktiviert einen Thread aus jedem Wartezustand heraus und veranlasst, dass ThreadInterruptedException im Zielthread ausgelöst wird.
Thread.Abort ist vergleichbar mit Thread.Interrupt, allerdings wird dabei ThreadAbortException für den Thread ausgelöst. Nähere Informationen dazu finden Sie unter Zerstören von Threads.
Unterbrechen und Fortsetzen (veraltet)
![]() |
---|
In .NET Framework, Version 2.0, wurden die Thread.Suspend-Methode und die Thread.Resume-Methode als veraltet eingestuft. Sie werden in zukünftigen Versionen nicht mehr unterstützt. |
Durch den Aufruf von Thread.Suspend kann ein Thread auch angehalten werden. Wenn ein Thread Thread.Suspend für sich selbst aufruft, wird er so lange blockiert, bis er durch einen anderen Thread fortgesetzt wird. Ruft ein Thread Thread.Suspend für einen anderen Thread auf, handelt es sich um einen nicht blockierenden Aufruf, durch den der andere Thread angehalten wird. Durch den Aufruf von Thread.Resume wird ein anderer Thread aus dem unterbrochenen Zustand herausgelöst und zum Fortsetzen der Ausführung veranlasst, unabhängig davon, wie oft Thread.Suspend aufgerufen wurde. Wird z. B. Thread.Suspend fünf Mal hintereinander und anschließend Thread.Resume aufgerufen, fährt der Thread unmittelbar nach dem Aufruf von Thread.Resume mit der Ausführung fort.
Im Gegensatz zu Thread.Sleep bewirkt Thread.Suspend keinen sofortigen Ausführungsstopp des Threads. Erst wenn der Thread einen Sicherungspunkt erreicht hat, kann er durch die Common Language Runtime unterbrochen werden. Ein Thread kann nicht unterbrochen werden, bevor er gestartet oder nachdem er gestoppt wurde. Weitere Informationen zu Sicherungspunkten finden Sie unter Thread.Suspend, Garbage Collection und Sicherungspunkte.
![]() |
---|
Die Thread.Suspend-Methode und die Thread.Resume-Methode sind nicht generell bei allen Anwendungen nützlich und sollten nicht mit Mechanismen zur Synchronisierung verwechselt werden. Da Thread.Suspend und Thread.Resume nicht auf die Kooperation mit dem gesteuerten Thread angewiesen sind, sind sie sehr intrusiv. Daraus können ernste Anwendungsprobleme entstehen, z. B. Deadlocks (wenn beispielsweise ein Thread unterbrochen wird, der eine von einem anderen Thread benötigte Ressource belegt). |
Bei einigen Anwendungen muss die Threadpriorität gesteuert werden, um ihre Leistung zu verbessern. Es ist ratsam, dafür die Priority-Eigenschaft und nicht Thread.Suspend zu verwenden.
Siehe auch
Konzepte
Übersicht über Synchronisierungsprimitiven
Thread.Suspend, Garbage Collection und Sicherungspunkte