Verwenden von Threads und Threading

Sie können mit .NET Anwendungen schreiben, die mehrere Vorgänge zur gleichen Zeit ausführen. Vorgänge, die möglicherweise andere Vorgänge aufhalten, können in separaten Threads ausgeführt werden. Dieser Prozess ist als Multithreading oder Freies Threading bekannt.

Clientanwendungen, die Multithreading verwenden, reagieren besser auf Benutzereingaben, weil die Benutzeroberfläche aktiv bleibt, da prozessorintensive Aufgaben in separaten Threads ausgeführt werden. Multithreading ist auch nützlich, wenn Sie skalierbare Aufgaben erstellen, da Sie Threads bei steigender Arbeitsauslastung hinzufügen können.

Hinweis

Wenn Sie mehr Kontrolle über das Verhalten von Threads der Anwendung benötigen, können Sie die Threads selbst verwalten. Die Multithreadprogrammierung wird erheblich vereinfacht durch die Klassen System.Threading.Tasks.Parallel und System.Threading.Tasks.Task, Parallel LINQ (PLINQ), parallele Auflistungsklassen im System.Collections.Concurrent-Namespace und ein Programmiermodell, das auf dem Konzept von Tasks anstatt von Threads basiert. Weitere Informationen finden Sie in den Artikeln zur parallelen Programmierung und zu Task Parallel Library (TPL).

Vorgehensweise: Erstellen und Starten eines neuen Threads

Sie erstellen einen neuen Thread, indem Sie eine neue Instanz der System.Threading.Thread-Klasse erstellen. Sie geben den Namen der Methode an, die Sie für den neuen Thread für den Konstruktor ausführen möchten. Rufen Sie die Thread.Start-Methode auf, um einen erstellten Thread auszuführen. Weitere Informationen und Beispiele finden Sie unter Erstellen von Threads und Übergeben von Daten zur Startzeit und in der Thread-API-Referenz.

Vorgehensweise: Anhalten eines Threads

Verwenden Sie System.Threading.CancellationToken, um die Ausführung eines Threads zu beenden. Mit dieser Methode lassen sich Threads kooperativ anhalten. Weitere Informationen finden Sie unter Abbruch in verwalteten Threads.

Manchmal ist es nicht möglich, einen Thread kooperativ zu beenden, weil darin Drittanbietercode ausgeführt wird, der für einen kooperativen Abbruch nicht geeignet ist. In diesem Fall müssen Sie die Beendigung der Ausführung möglicherweise erzwingen. Um die Beendigung der Ausführung eines Threads zu erzwingen, können Sie in .NET Framework die Methode Thread.Abort verwenden. Diese Methode löst eine ThreadAbortException im Thread aus, in dem sie aufgerufen wird. Weitere Informationen finden Sie unter Zerstören von Threads. Die Methode Thread.Abort wird in .NET Core nicht unterstützt. Wenn Sie die Beendigung der Ausführung von Drittanbietercode in .NET Core erzwingen müssen, führen Sie den Code in einem separaten Prozess aus, und verwenden Sie die Process.Kill-Methode.

System.Threading.CancellationToken steht erst ab .NET Framework 4 zur Verfügung. Zum Beenden eines Threads in älteren Versionen von .NET Framework verwenden Sie die Techniken zur Threadsynchronisierung, um die kooperative Beendigung manuell zu implementieren. Sie können beispielsweise das flüchtige (volatile) boolesche Feld shouldStop erstellen und damit anfordern, dass der vom Thread ausgeführte Code angehalten wird. Weitere Informationen finden Sie unter volatile in der C#-Referenz sowie unter System.Threading.Volatile.

Verwenden Sie die Thread.Join-Methode, damit der aufrufende Thread auf die Beendigung des Threads wartet, der angehalten wird.

Vorgehensweise: Anhalten oder Unterbrechen eines Threads

Mit der Thread.Sleep-Methode können Sie den aktuellen Thread für bestimmte Zeit pausieren. Sie können einen blockierten Thread unterbrechen, indem Sie die Thread.Interrupt-Methode aufrufen. Weitere Informationen finden Sie unter Pausing and interrupting threads (Anhalten und Unterbrechen von Threads).

Threadeigenschaften

In der folgenden Tabelle werden einige Thread-Eigenschaften aufgeführt:

Eigenschaft BESCHREIBUNG
IsAlive Gibt true zurück, wenn ein Thread gestartet und noch nicht ordnungsgemäß beendet bzw. abgebrochen wurde.
IsBackground Es wird ein boolescher Wert abgerufen oder festgelegt, der angibt, ob ein Thread ein Hintergrundthread ist. Hintergrundthreads sind wie Vordergrundthreads. Ein Hintergrundthread verhindert jedoch nicht, dass ein Prozess beendet wird. Sobald alle zu einem Prozess gehörenden Vordergrundthreads beendet wurden, beendet die Common Language Runtime den Prozess, indem die Methode Abort in Hintergrundthreads aufgerufen wird, die noch aktiv sind. Weitere Informationen finden Sie im Artikel zu Vordergrund- und Hintergrundthreads.
Name Ruft den Namen eines Threads ab oder legt diesen fest. Wird am häufigsten beim Debuggen verwendet, um einzelne Threads zu erkennen.
Priority Es wird ein ThreadPriority-Wert abgerufen oder festgelegt, der vom Betriebssystem zum Priorisieren der Threadplanung verwendet wird. Weitere Informationen finden Sie unter Scheduling Threads (Planen von Threads) und in der ThreadPriority-Referenz.
ThreadState Ruft einen ThreadState-Wert ab, der die aktuellen Zustände des Threads enthält.

Siehe auch