Vorheriger Beitrag: Workshop: Alles über .NET-Threads – Teil 1
Workshop: Alles über .NET-Threads – Teil 2
Meine kleine .NET-Serie zum Thema Threads geht heute in die zweite Runde. Nachdem es gestern um das Erzeugen von Threads ging, handelt Teil zwei von der Thread-Verwaltung. Dabei unterscheidet man zwischen Beenden, Warten, Anhalten und Fortsetzen.
Beenden von Threads: Dies geschieht am einfachsten, indem ein Thread ganz regulär während des Programmablaufs verlassen wird und die Anwendung wieder zum Masterthread zurückkehrt. Dies gibt der Common Language Runtime (CLR) die Möglichkeit, die notwendigen Aufräumarbeiten durchzuführen. Allerdings muss manchmal ein anderer als der gerade laufende Thread beendet werden. Daher hat Microsoft den .NET-Thread-APIs eine Methode spendiert, die sich Abort() nennt, mit deren Hilfe ein laufender Thread abgebrochen werden kann. Beim Aufruf von Abort() wird automatisch eine ThreadAbortException ausgelöst.
Der Aufruf von Abort() zieht übrigens eine Reihe verschiedener Dinge nach sich. Dazu gehört die Fähigkeit des Threads, den eigenen Abbruch zu vereiteln, indem er innerhalb des Exception-Handlers die Methode System.Threading.Thread.ResetAbort aufruft. Daneben besteht die Möglichkeit, innerhalb eines Codeblocks mithilfe von finally weiteren Quellcode ausführen zu lassen, was im ungünstigsten Fall eine beachtliche Verzögerung des Thread-Abbruchs nach sich zieht. Aus diesen beiden Gründen sollte man zur Laufzeit überprüfen, ob ein bestimmter Thread auch vollständig abgebrochen wurde. Hierfür steht die Join-Methode zur Verfügung.
Auf einen Thread warten: Die parallele Ausführung mehrerer Threads innerhalb eines Programmes bringt es zwangsläufig mit sich, dass Threads immer wieder aufeinander warten müssen. Um dies zu erreichen, hat Microsoft dem .NET-Framework die Thread-Methode Join() verpasst, was ein Zusammenführen zweier Threads bedeutet. In der Konsequenz heißt das, dass ein Thread mit seiner Fortsetzung so lange wartet, bis ein vorhergehender Thread fertig ist. Da dies zu unliebsamen Nebeneffekten führen kann (Stichwort: Dead Lock), besteht die Möglichkeit, Join() einen Parameter zu übergeben, der einen Integerwert darstellt. Dieser Wert besagt, wie lange gewartet werden soll, bis der Vorgänger-Thread (voraussichtlich) beendet wird. Das Ergebnis von Join() ist ein boolscher Wert, der true (Thread beendet) oder false (Thread nicht beendet) annehmen kann.
Threads anhalten und fortsetzen: Im Gegensatz zur Methode Sleep(), mit der ein Thread für eine festgelegte Zeitdauer angehalten und automatisch fortgesetzt wird, besteht eine weitere Möglichkeit, einen Thread auf unbestimmte Zeit zu stoppen und zu einem späteren Zeitpunkt wieder aufzunehmen. Die hierfür zuständigen Methoden nennen sich Suspend() und Resume(). Beiden Methoden kann kein Argument übergeben werden und beide liefern auch keinen Rückgabewert.

Kommentare
Keine Kommentare vorhanden.