Multithreadanwendungen (C#)

Sie können mit C# Anwendungen schreiben, die mehrere Aufgaben zur gleichen Zeit ausführen. Aufgaben, die möglicherweise andere Aufgaben 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.

Erstellen und Verwenden von Threads

Wenn Sie mehr Kontrolle über das Verhalten von Threads der Anwendung benötigen, können Sie die Threads selbst verwalten. Beachten Sie jedoch, dass das Schreiben fehlerfreier Multithreadanwendungen schwierig sein kann: Ihre Anwendung reagiert vielleicht nicht mehr oder stößt auf vorübergehende Fehler, die durch Racebedingungen verursacht werden. Weitere Informationen finden Sie unter Threadsichere Komponenten.

Sie erstellen einen neuen Thread, indem Sie eine Variable des Typs Thread deklarieren und den Konstruktor aufrufen, der den Namen der Prozedur oder Methode bereitstellt, die Sie in einem neuen Thread ausführen möchten. Der folgende Code veranschaulicht dies.

System.Threading.Thread newThread =  
    new System.Threading.Thread(AMethod);  

Starten und Beenden von Threads

Verwenden Sie zum Starten eines neuen Threads die Methode Start, wie im folgenden Code gezeigt wird.

newThread.Start();  

Verwenden Sie zum Beenden eines Threads die Methode Abort, wie im folgenden Code gezeigt wird.

newThread.Abort();  

Neben dem Starten und Beenden von Threads können Sie Threads auch mithilfe der Methoden Sleep oder Suspend anhalten. Sie setzen einen angehaltenen Thread mithilfe der Methode Resume fort, und löschen einen Thread mithilfe der Methode Abort.

Thread-Methoden

Die folgende Tabelle zeigt einige der Methoden, mit denen Sie einzelne Threads steuern.

Methode Aktion
Start Bewirkt, dass ein Thread gestartet wird
Sleep Hält einen Thread für eine angegebene Zeit an
Suspend Hält einen Thread an, wenn er einen sicheren Punkt erreicht
Abort Beendet einen Thread, wenn er einen sicheren Punkt erreicht
Resume Startet einen angehaltenen Thread neu
Join Bewirkt, dass der aktuelle Thread auf das Ende eines anderen Threads wartet. Wird der Thread mit einem Timeoutwert verwendet, gibt diese Methode True zurück, wenn er in der zugewiesenen Zeit fertig wird.

Sicherungspunkte

Die meisten dieser Methoden sind selbsterklärend, doch der Begriff Sicherungspunkte ist vielleicht neu für Sie. Sicherungspunkte sind Stellen im Code, an denen die Common Language Runtime die automatische Speicherbereinigung – den Prozess zur Freigabe von Speicher und nicht verwendeten Variablen – sicher ausführen kann. Wenn Sie die Methode Abort oder Suspend eines Threads aufrufen, analysiert die Common Language Runtime den Code und ermittelt den Ort einer geeigneten Stelle, an der der Thread nicht mehr ausgeführt wird.

Threadeigenschaften

Threads enthalten außerdem einige nützliche Eigenschaften, wie in der folgenden Tabelle dargestellt wird:

Eigenschaft Wert
IsAlive Enthält den Wert True, wenn ein Thread aktiv ist.
IsBackground Es wird ein boolescher Wert abgerufen oder festgelegt, der angibt, ob ein Thread ein Hintergrundthread ist oder sein sollte. Hintergrundthreads sind wie Vordergrundthreads, aber ein Hintergrundthread verhindert 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.
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 Wert abgerufen oder festgelegt, der vom Betriebssystem zum Priorisieren der Threadplanung verwendet wird.
ThreadState Enthält einen Wert, der Zustand oder Zustände eines Threads beschreibt.

Threadprioritäten

Jeder Thread hat eine Prioritätseigenschaft, die bestimmt, wie groß oder klein ein Segment der Prozessorzeit ist, das er ausführen muss. Das Betriebssystem ordnet Threads mit hoher Priorität größere Zeiträume und Threads mit niedriger Priorität kürzere Zeiträume zu. Neue Threads werden mit dem Wert Normal erstellt, aber Sie können die Eigenschaft Priority auf einen beliebigen Wert in der ThreadPriority-Enumeration ändern.

Eine genauere Beschreibung der verschiedenen Threadprioritäten finden Sie unter ThreadPriority.

Vordergrund- und Hintergrundthreads

Ein Vordergrundthread wird dauerhaft ausgeführt, während ein Hintergrundthread beendet wird, sobald der letzte Vordergrundthread beendet wurde. Sie können die Eigenschaft IsBackground verwenden, um den Hintergrundzustand eines Threads zu bestimmen oder zu ändern.

Siehe auch

Thread
Thread Synchronization (C#) (Threadsynchronisierung (C#))
Parameter und Rückgabewerte für Multithreadprozeduren (C#)
Treading (C#)