Threading (C#)

Mit Threading kann Ihr C#-Programm parallele Verarbeitungsaufgaben durchführen, damit Sie mehr als einen Vorgang gleichzeitig durchführen können. Sie können z.B. Threading verwenden, um Benutzereingaben zu überwachen, Aufgaben im Hintergrund auszuführen und parallele Eingabestreams zu behandeln.

Threads weisen folgende Eigenschaften auf:

Standardmäßig verfügt ein C#-Programm über einen Thread. Sie können aber Hilfsthreads erstellen und diese parallel zum primären Thread zur Ausführung von Code verwenden. Diese Threads werden auch als Arbeitsthreads bezeichnet.

Arbeitsthreads können zum durchführen von zeitaufwändigen oder zeitkritischen Aufgaben verwendet werden, ohne dass dadurch der primäre Thread gebunden wird. Arbeitsthreads werden z.B. oft in Serveranwendungen verwendet, um eingehende Anforderungen zu erfüllen, ohne dass auf den Abschluss der vorherigen Anforderung gewartet werden muss. Arbeitsthreads werden auch verwendet, um Aufgaben im Hintergrund in der Desktopanwendung auszuführen, damit der Hauptthread – der Elemente der Benutzeroberfläche antreibt – weiterhin auf Benutzeraktionen reagieren kann.

Threading löst Probleme beim Durchsatz und der Reaktionsfähigkeit. Es kann allerdings zu Problemen bei der Ressourcenfreigabe führen, wie z.B. zu Deadlocks oder zu Racebedingungen. Mehrere Threads eignen sich am besten für Aufgaben, die verschiedenen Ressourcen erfordern, wie etwa Dateihandles und Netzwerkverbindungen. Wenn Sie einer Ressource mehrere Threads zuweisen, kann es zu Synchronisierungsproblemen kommen. Wenn Threads oft beim Warten auf andere Threads blockiert sind, verfehlt dies den Zweck mehrerer Threads.

Eine gängige Herangehensweise ist hier das Verwenden von Arbeitsthreads, die zeitaufwändige oder zeitkritische Aufgaben durchführen, die nicht viele der Ressourcen erfordern, die von anderen Threads verwendet werden. Auf einige der Ressourcen in Ihrem Programm muss aber selbstverständlich von mehreren Threads zugegriffen werden. Für diese Fälle stellt der System.Threading-Namespace Klassen für das Synchronisieren von Threads bereit. Diese Klassen umfassen Mutex, Monitor Interlocked, AutoResetEvent und ManualResetEvent.

Sie können einige oder alle diese Klassen zum Synchronisieren der Aktivitäten mehrerer Threads verwenden. Allerdings wird der Support für das Threading teilweise von C# unterstützt. Die Lock-Anweisung stellt z.B. Synchronisierungsfunktionen durch das implizit Verwenden von Monitor bereit.

Hinweis

Ab .NET Framework 4 wurde die Multithreadprogrammierung erheblich vereinfacht, und zwar durch die Klassen System.Threading.Tasks.Parallel und System.Threading.Tasks.Task, Parallel LINQ (PLINQ), neue parallele Auflistungsklassen im System.Collections.Concurrent-Namespace und ein neues Programmiermodell, das auf dem Konzept von Aufgaben anstatt von Threads basiert. Weitere Informationen finden Sie unter Parallel Programming in the .NET Framework (Parallele Programmierung in .NET Framework).

Titel Beschreibung
Multithreaded Applications (C#) (Multithreadanwendungen (C#)) Beschreibt das Erstellen und Verwenden von Threads
Parameter und Rückgabewerte für Multithreadprozeduren (C#) Beschreibt, wie Sie Parameter mit Multithreadanwendungen übergeben und zurückgeben können
Exemplarische Vorgehensweise: Multithreading mit der BackgroundWorker-Komponente (C#) Veranschaulicht, wie Sie eine einfache Multithreadanwendung erstellen können
Threadsynchronisierung (C#) Beschreibt, wie Sie die Interaktionen von Threads steuern können
Threadzeitgeber (C#) Beschreibt, wie die Prozeduren auf separaten Threads in regelmäßigen Abständen ausführen können
Thread Pooling (C#) (Pooling von Threads (C#)) Beschreibt, wie Sie einen Pool von Arbeitsthreads verwenden können, die vom System verwaltet werden
Vorgehensweise: Verwenden eines Threadpools (C#) Veranschaulicht das synchronisierte Verwenden von mehreren Threads im Threadpool
Threading Beschreibt, wie Sie Threading in .NET Framework implementieren