Freigeben über


Anhalten und Fortsetzen von Threads

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 System.Threading.Thread.Sleep-Methode wird der aktuelle Thread sofort für die Dauer der Übergabe (in Millisekunden) an System.Threading.Thread.Sleep blockiert. Dabei wird der restliche Zeitanteil dieses Threads einem anderen Thread zur Verfügung gestellt. Ein Thread kann System.Threading.Thread.Sleep nicht für einen anderen Thread aufrufen.

Durch den Aufruf von System.Threading.Thread.Sleep mit System.Threading.Timeout.Infinite bleibt ein Thread so lange deaktiviert, bis er unterbrochen wird, indem ein anderer Thread System.Threading.Thread.Interrupt aufruft, oder bis er durch System.Threading.Thread.Abort beendet wird.

Unterbrechen von Threads

Ein Thread in Warteposition kann durch den Aufruf von System.Threading.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.

Hinweis

Ist der Zielthread beim Aufruf von System.Threading.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 System.Threading.Thread.Interrupt und System.Threading.Thread.Abort sofort aktiviert werden. Bei nicht verwalteten Wartezuständen (z. B. bei einem Plattformaufruf der Win32-WaitForSingleObject-Funktion) kann weder System.Threading.Thread.Interrupt noch System.Threading.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:

  • System.Threading.Thread.Interrupt aktiviert einen Thread aus jedem Wartezustand heraus und veranlasst, dass ThreadInterruptedException im Zielthread ausgelöst wird.

  • System.Threading.Thread.Abort ist vergleichbar mit System.Threading.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)

Wichtig

In .NET Framework, Version 2.0, wurden die System.Threading.Thread.Suspend-Methode und die System.Threading.Thread.Resume-Methode als veraltet eingestuft. Sie werden in zukünftigen Versionen nicht mehr unterstützt.

Durch den Aufruf von System.Threading.Thread.Suspend kann ein Thread auch angehalten werden. Wenn ein Thread System.Threading.Thread.Suspend für sich selbst aufruft, wird er so lange blockiert, bis er durch einen anderen Thread fortgesetzt wird. Ruft ein Thread System.Threading.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 System.Threading.Thread.Resume wird ein anderer Thread aus dem unterbrochenen Zustand herausgelöst und zum Fortsetzen der Ausführung veranlasst, unabhängig davon, wie oft System.Threading.Thread.Suspend aufgerufen wurde. Wird z. B. System.Threading.Thread.Suspend fünf Mal hintereinander und anschließend System.Threading.Thread.Resume aufgerufen, fährt der Thread unmittelbar nach dem Aufruf von System.Threading.Thread.Resume mit der Ausführung fort.

Im Gegensatz zu System.Threading.Thread.Sleep bewirkt System.Threading.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.

Wichtig

Die System.Threading.Thread.Suspend-Methode und die System.Threading.Thread.Resume-Methode sind nicht generell bei allen Anwendungen nützlich und sollten nicht mit Mechanismen zur Synchronisierung verwechselt werden. Da System.Threading.Thread.Suspend und System.Threading.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 System.Threading.Thread.Suspend zu verwenden.

Siehe auch

Referenz

Thread
ThreadInterruptedException
ThreadAbortException

Konzepte

Übersicht über Synchronisierungsprimitiven
Thread.Suspend, Garbage Collection und Sicherungspunkte

Weitere Ressourcen

Verwaltetes Threading
Verwenden von Threads und Threading