Threadsichere AuflistungenThread-Safe Collections

.NET Framework 4.NET Framework 4 führt den System.Collections.Concurrent-Namespace ein, der mehrere Auflistungsklassen einschließt, die sowohl threadsicher als auch skalierbar sind.The .NET Framework 4.NET Framework 4 introduces the System.Collections.Concurrent namespace, which includes several collection classes that are both thread-safe and scalable. Mehrere Threads können diesen Auflistungen sicher und effizient Elemente hinzufügen bzw. daraus entfernen, ohne dass zusätzliche Synchronisierung in Benutzercode erforderlich ist.Multiple threads can safely and efficiently add or remove items from these collections, without requiring additional synchronization in user code. Wenn Sie neuen Code schreiben, verwenden Sie die gleichzeitigen Auflistungsklassen, wenn von der Auflistung gleichzeitig Elemente in mehrere Threads geschrieben werden.When you write new code, use the concurrent collection classes whenever the collection will be writing to multiple threads concurrently. Wenn Sie nur von einer freigegebenen Auflistung lesen, können Sie die Klassen im System.Collections.Generic-Namespace verwenden.If you are only reading from a shared collection, then you can use the classes in the System.Collections.Generic namespace. Es wird empfohlen, keine 1.0-Auflistungsklassen zu verwenden, sofern als Zielversion nicht .NET Framework 1.1 oder eine frühere Laufzeit festgelegt wird.We recommend that you do not use 1.0 collection classes unless you are required to target the .NET Framework 1.1 or earlier runtime.

Threadsynchronisierung in den Auflistungen von .NET Framework 1.0 und 2.0Thread Synchronization in the .NET Framework 1.0 and 2.0 Collections

Die in .NET Framework 1.0 eingeführten Auflistungen befinden sich im System.Collections-Namespace.The collections introduced in the .NET Framework 1.0 are found in the System.Collections namespace. Diese Auflistungen, die das häufig verwendete ArrayList-Objekt und das Hashtable-Objekt einschließen, bieten eine gewisse Threadsicherheit durch die Synchronized-Eigenschaft, von der ein threadsicherer Wrapper um die Auflistung zurückgegeben wird.These collections, which include the commonly used ArrayList and Hashtable, provide some thread-safety through the Synchronized property, which returns a thread-safe wrapper around the collection. Der Wrapper funktioniert folgendermaßen: Die gesamte Auflistung wird bei jedem Hinzufüge- oder Entfernungsvorgang gesperrt.The wrapper works by locking the entire collection on every add or remove operation. Daher muss jeder Thread, der versucht, auf die Auflistung zuzugreifen, warten, bis er die jeweilige Sperre übernehmen kann.Therefore, each thread that is attempting to access the collection must wait for its turn to take the one lock. Dies ist nicht skalierbar und kann beträchtliche Leistungseinbußen für große Auflistungen verursachen.This is not scalable and can cause significant performance degradation for large collections. Außerdem wird der Entwurf nicht völlig vor Racebedingungen geschützt.Also, the design is not completely protected from race conditions. Weitere Informationen finden Sie unter Synchronisierung in generischen Auflistungen auf der MSDN-Website.For more information, see Synchronization in Generic Collections on the MSDN Web site.

Die in .NET Framework 2.0 eingeführten Auflistungsklassen befinden sich im System.Collections.Generic-Namespace.The collection classes introduced in the .NET Framework 2.0 are found in the System.Collections.Generic namespace. Dazu gehören List<T>, Dictionary<TKey,TValue> usw.These include List<T>, Dictionary<TKey,TValue>, and so on. Diese Klassen bieten verbesserte Typsicherheit und Leistung im Vergleich zu den .NET Framework 1.0-Klassen.These classes provide improved type safety and performance compared to the .NET Framework 1.0 classes. Die .NET Framework 2.0-Auflistungsklassen stellen jedoch keine Threadsynchronisierung bereit; Benutzercode muss die gesamte Synchronisierung bereitstellen, wenn Elemente gleichzeitig in mehreren Threads hinzugefügt oder entfernt werden.However, the .NET Framework 2.0 collection classes do not provide any thread synchronization; user code must provide all synchronization when items are added or removed on multiple threads concurrently.

Es wird empfohlen, die gleichzeitigen Auflistungsklassen in .NET Framework 4.NET Framework 4 zu verwenden, da sie nicht nur die Typsicherheit der .NET Framework 2.0-Auflistungsklassen, sondern auch effizientere und vollständigere Threadsicherheit als die .NET Framework 1.0.NET Framework 1.0-Auflistungen bieten.We recommend the concurrent collections classes in the .NET Framework 4.NET Framework 4 because they provide not only the type safety of the .NET Framework 2.0 collection classes, but also more efficient and more complete thread safety than the .NET Framework 1.0.NET Framework 1.0 collections provide.

Differenzierte Sperre und sperrenfreie MechanismenFine-Grained Locking and Lock-Free Mechanisms

Einige der gleichzeitigen Auflistungstypen verwenden einfache Synchronisierungsmechanismen z. B. SpinLock, SpinWait, SemaphoreSlim, und CountdownEvent, die neu in .NET Framework 4.NET Framework 4 sind.Some of the concurrent collection types use lightweight synchronization mechanisms such as SpinLock, SpinWait, SemaphoreSlim, and CountdownEvent, which are new in the .NET Framework 4.NET Framework 4. Diese Synchronisierungstypen verwenden normalerweise andauernde Spinvorgänge für die kurzen Zeiträume, bevor der Thread in einen echten Wartezustand versetzt wird.These synchronization types typically use busy spinning for brief periods before they put the thread into a true Wait state. Wenn Wartezeiten als sehr kurz eingeschätzt werden, sind Spinvorgänge weitaus weniger rechenintensiv als Wartezustände, die einen aufwändigen Kernel-Übergang umfassen.When wait times are expected to be very short, spinning is far less computationally expensive than waiting, which involves an expensive kernel transition. Für Auflistungsklassen, für die Spinvorgänge verwendet werden, bedeutet diese Effizienz, dass mehrere Threads Elemente mit einer sehr hohen Rate hinzufügen und entfernen können.For collection classes that use spinning, this efficiency means that multiple threads can add and remove items at a very high rate. Weitere Informationen zu Spinvorgängen im Vergleich zu Blockierungen finden Sie unter SpinLock und SpinWait.For more information about spinning vs. blocking, see SpinLock and SpinWait.

Für die ConcurrentQueue<T>-Klasse und die ConcurrentStack<T>-Klasse werden gar keine Sperren verwendet.The ConcurrentQueue<T> and ConcurrentStack<T> classes do not use locks at all. Stattdessen wird die Threadsicherheit durch Interlocked-Vorgänge gewährleistet.Instead, they rely on Interlocked operations to achieve thread-safety.

Hinweis

Da die gleichzeitigen Auflistungsklassen ICollection unterstützen, stellen sie Implementierungen für die IsSynchronized-Eigenschaft und die SyncRoot-Eigenschaft bereit, auch wenn diese Eigenschaften nicht relevant sind.Because the concurrent collections classes support ICollection, they provide implementations for the IsSynchronized and SyncRoot properties, even though these properties are irrelevant. IsSynchronized gibt immer false zurück, und SyncRoot ist immer null (Nothing in Visual Basic).IsSynchronized always returns false and SyncRoot is always null (Nothing in Visual Basic).

In der folgenden Tabelle sind die Auflistungstypen im System.Collections.Concurrent-Namespace aufgeführt.The following table lists the collection types in the System.Collections.Concurrent namespace.

TypType descriptionDescription
BlockingCollection<T> Stellt Begrenzungs- und Blockierungsfunktionen für jeden Typ bereit, von dem IProducerConsumerCollection<T> implementiert wird.Provides bounding and blocking functionality for any type that implements IProducerConsumerCollection<T>. Weitere Informationen finden Sie unter Übersicht über BlockingCollection.For more information, see BlockingCollection Overview.
ConcurrentDictionary<TKey,TValue> Threadsichere Implementierung eines Wörterbuchs von Schlüssel-Wert-Paaren.Thread-safe implementation of a dictionary of key-value pairs.
ConcurrentQueue<T> Threadsichere Implementierung einer First In, First Out (FIFO)-Warteschlange.Thread-safe implementation of a FIFO (first-in, first-out) queue.
ConcurrentStack<T> Threadsichere Implementierung eines Last In, First Out (LIFO)-Stapels.Thread-safe implementation of a LIFO (last-in, first-out) stack.
ConcurrentBag<T> Threadsichere Implementierung einer ungeordneten Auflistung von Elementen.Thread-safe implementation of an unordered collection of elements.
IProducerConsumerCollection<T> Die Schnittstelle, die ein Typ implementieren muss, damit sie in BlockingCollection verwendet werden kann.The interface that a type must implement to be used in a BlockingCollection.
TitelTitle descriptionDescription
Übersicht über BlockingCollectionBlockingCollection Overview Beschreibt die vom BlockingCollection<T>-Typ bereitgestellte Funktion.Describes the functionality provided by the BlockingCollection<T> type.
Vorgehensweise: Hinzufügen und Entfernen von Elementen aus einem ConcurrentDictionaryHow to: Add and Remove Items from a ConcurrentDictionary Beschreibt, wie Elemente aus einem ConcurrentDictionary<TKey,TValue>-Objekt hinzugefügt und entfernt werden.Describes how to add and remove elements from a ConcurrentDictionary<TKey,TValue>
Vorgehensweise: Hinzufügen und Entfernen von einzelnen Elementen zu bzw. aus einer BlockingCollectionHow to: Add and Take Items Individually from a BlockingCollection Beschreibt, wie Elemente einer Blockierungsauflistung hinzugefügt und daraus abgerufen werden, ohne dass der schreibgeschützte Enumerator verwendet wird.Describes how to add and retrieve items from a blocking collection without using the read-only enumerator.
Vorgehensweise: Hinzufügen von Begrenzungs- und Blockadefunktionen zu einer AuflistungHow to: Add Bounding and Blocking Functionality to a Collection Beschreibt, wie jede Auflistungsklasse als zugrunde liegender Speichermechanismus für eine IProducerConsumerCollection<T>-Auflistung verwendet wird.Describes how to use any collection class as the underlying storage mechanism for an IProducerConsumerCollection<T> collection.
Vorgehensweise: Entfernen von Elementen in einer BlockingCollection mit ForEachHow to: Use ForEach to Remove Items in a BlockingCollection Beschreibt, wie mit einer foreach-Anweisung (For Each in Visual Basic) alle Elemente in einer Blockierungsauflistung entfernt werden.Describes how to use foreach, (For Each in Visual Basic) to remove all items in a blocking collection.
Vorgehensweise: Verwenden von Arrays mit blockierenden Auflistungen in einer PipelineHow to: Use Arrays of Blocking Collections in a Pipeline Beschreibt, wie mit mehreren Blockierungsauflistungen gleichzeitig eine Pipeline implementiert wird.Describes how to use multiple blocking collections at the same time to implement a pipeline.
Vorgehensweise: Erstellen eines Objektpools mittels ConcurrentBagHow to: Create an Object Pool by Using a ConcurrentBag Zeigt die Verwendung einer parallelen Sammlung zur Verbesserung der Leistung in Szenarien, in denen Sie Objekte nicht fortlaufend neu erstellen müssen, sondern diese wiederverwenden können.Shows how to use a concurrent bag to improve performance in scenarios where you can reuse objects instead of continually creating new ones.

VerweisReference

System.Collections.Concurrent