Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
.NET stellt mehrere Typen bereit, die für die parallele Programmierung nützlich sind. Darunter befinden sich eine Reihe von parallelen Auflistungsklassen, einfache Synchronisierungsprimitive und Typen für die verzögerte Initialisierung. Sie können diese Typen mit jedem Multithread-Anwendungscode verwenden, einschließlich der Task Parallel Library und PLINQ.You can use these types with any multithreaded application code, including the Task Parallel Library and PLINQ.
Parallele Auflistungsklassen
Die Auflistungsklassen im Namespace System.Collections.Concurrent bieten threadsichere Vorgänge für das Hinzufügen und Entfernen. Diese vermeiden Sperren, wo immer dies möglich ist, und setzen differenzierte Sperren ein, wenn Sperren erforderlich sind. Eine parallele Auflistungsklasse benötigt beim Zugriff auf Elemente keinen Benutzercode für Sperren. Die gleichzeitigen Sammlungsklassen können die Leistung gegenüber Typen wie System.Collections.ArrayList z. B. und System.Collections.Generic.List<T> (mit vom Benutzer implementierter Sperrung) in Szenarien erheblich verbessern, in denen mehrere Threads Elemente aus einer Auflistung hinzufügen und entfernen.
In der folgenden Tabelle sind die parallelen Auflistungsklassen aufgeführt:
Typ | BESCHREIBUNG |
---|---|
System.Collections.Concurrent.BlockingCollection<T> | Stellt Sperr- und Begrenzungsfunktionen für threadsichere Auflistungen bereit, die System.Collections.Concurrent.IProducerConsumerCollection<T> implementieren. Producerthreads werden blockiert, wenn keine Zeitfenster verfügbar sind oder wenn die Auflistung voll ist. Consumerthreads werden blockiert, wenn die Auflistung leer ist. Dieser Typ unterstützt auch den nicht blockierenden Zugriff von Verbrauchern und Produzenten. BlockingCollection<T> kann als Basisklasse oder Sicherungsspeicher verwendet werden, um Blockierung und Begrenzung für jede Sammlungsklasse zu bieten, die IEnumerable<T> unterstützt. |
System.Collections.Concurrent.ConcurrentBag<T> | Eine Threadsichere Bag-Implementierung, die skalierbare Add- und Get-Vorgänge bereitstellt. |
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> | Ein gleichzeitiger und skalierbarer Wörterbuchtyp. |
System.Collections.Concurrent.ConcurrentQueue<T> | Eine gleichzeitige und skalierbare FIFO-Warteschlange. |
System.Collections.Concurrent.ConcurrentStack<T> | Ein gleichzeitiger und skalierbarer LIFO-Stapel. |
Weitere Informationen finden Sie unter Thread-Safe Sammlungen.
Synchronisierungsprimitiven
Die Synchronisierungsgrundtypen im System.Threading Namespace ermöglichen eine differenzierte Parallelität und eine schnellere Leistung, indem teure Sperrmechanismen vermieden werden, die im älteren Multithreading-Code gefunden wurden.
In der folgenden Tabelle sind die Synchronisierungstypen aufgeführt:
Typ | BESCHREIBUNG |
---|---|
System.Threading.Barrier | Ermöglicht es mehreren Threads, parallel an einem Algorithmus zu arbeiten, indem ein Punkt bereitgestellt wird, an dem jeder Vorgang seine Ankunft signalisieren und dann blockieren kann, bis einige oder alle Vorgänge eingegangen sind. Weitere Informationen finden Sie unter Barrier. |
System.Threading.CountdownEvent | Vereinfacht Fork- und Join-Szenarien durch einen einfachen Rendezvousmechanismus. Weitere Informationen finden Sie unter CountdownEvent. |
System.Threading.ManualResetEventSlim | Ein Synchronisierungsgrundtyp ähnlich wie System.Threading.ManualResetEvent. ManualResetEventSlim ist leichter, kann aber nur für die prozessinterne Kommunikation verwendet werden. |
System.Threading.SemaphoreSlim | Ein Synchronisierungsgrundtyp, der die Anzahl der Threads begrenzt, die gleichzeitig auf eine Ressource oder einen Pool von Ressourcen zugreifen können. Weitere Informationen finden Sie unter Semaphor und SemaphorESlim. |
System.Threading.SpinLock | Eine gegenseitige Ausschlusssperrprimitive, durch die der Thread, der die Sperre zu erlangen versucht, für eine gewisse Zeit in einer Schleife warten (oder rotieren) muss, bevor er sein Quantum liefert. In Szenarien, in denen die Wartezeit für die Sperre kurz sein soll, SpinLock bietet eine bessere Leistung als andere Sperrformen. Weitere Informationen finden Sie unter SpinLock. |
System.Threading.SpinWait | Ein kleiner, einfacher Typ, der für eine bestimmte Zeit rotiert und schließlich den Thread in einen Wartezustand versetzt, wenn die Schleifenzahl überschritten wird. Weitere Informationen finden Sie unter SpinWait. |
Weitere Informationen finden Sie unter:
Klassen mit verzögerter Initialisierung
Bei der faulen Initialisierung wird der Speicher für ein Objekt erst zugewiesen, wenn es benötigt wird. Eine verzögerte Initialisierung kann zur Verbesserung der Leistung beitragen, indem Objektzuweisungen über die Lebensdauer eines Programms hinweg verteilt werden. Sie können Lazy Initialization für jeden benutzerdefinierten Typ aktivieren, indem Sie den Typ Lazy<T> umschließen.
In der folgenden Tabelle sind die faulen Initialisierungstypen aufgeführt:
Typ | BESCHREIBUNG |
---|---|
System.Lazy<T> | Stellt einfache, threadsichere verzögerte Initialisierung bereit. |
System.Threading.ThreadLocal<T> | Stellt einen Wert durch eine verzögerte Initialisierung auf Threadbasis bereit, wobei jeder Thread die Initialisierungsfunktion verzögert aufruft. |
System.Threading.LazyInitializer | Stellt statische Methoden bereit, die die Zuweisung einer dedizierten, faulen Initialisierungsinstanz vermeiden. Stattdessen verwenden sie Verweise, um sicherzustellen, dass Ziele initialisiert wurden, während sie darauf zugreifen. |
Weitere Informationen finden Sie unter Lazy Initialization.
Aggregierte Ausnahmen
Der System.AggregateException Typ kann verwendet werden, um mehrere Ausnahmen zu erfassen, die gleichzeitig in separaten Threads ausgelöst werden, und sie als einzige Ausnahme an den verknüpfungsthread zurückzugeben. Die Typen System.Threading.Tasks.Task und System.Threading.Tasks.Parallel sowie PLINQ nutzen AggregateException umfassend für diesen Zweck. Weitere Informationen finden Sie unter Exception Handling and How to: Handle Exceptions in a PLINQ Query.