Auflistungen und Synchronisierung (Threadsicherheit)
Aktualisiert: November 2007
Klassen in System.Collections und verwandte Namespaces sind standardmäßig nicht threadsicher. Die Auflistung kann von mehreren Stellen gleichzeitig aus zuverlässig gelesen werden. Bei einer Veränderung der Auflistung werden allerdings nicht definierte Resultate für alle Threads erzeugt, die auf die Auflistung zugreifen, einschließlich der Threads zum Lesen.
System.Collections-Klassen können mit einer der folgenden Methoden threadsicher gemacht werden:
Erstellen Sie einen threadsicheren Wrapper mithilfe der Synchronized-Methode, und greifen Sie auf die Auflistung exklusiv über diesen Wrapper zu.
Leiten Sie, wenn für die Klasse keine Synchronized-Methode verfügbar ist, eine Synchronized-Methode ab, und implementieren Sie sie mithilfe der SyncRoot-Eigenschaft.
Wenden Sie einen Sperrmechanismus, wie die lock-Anweisung in C# (SyncLock in Visual Basic, Monitor-Klasse in C++), auf die SyncRoot-Eigenschaft an, wenn Sie auf die Auflistung zugreifen.
Beim Implementieren der Synchronized-Methode müssen abgeleitete Klassen die IsReadOnly-Eigenschaft überschrieben, damit der richtige Wert zurückgegeben wird.
Die Array-Klasse enthält keine Synchronized-Methode, und die Klasse kann nicht davon abgeleitet werden, obwohl sie eine SyncRoot-Eigenschaft enthält. Daher kann ein Array nur mithilfe des Sperrmechanismus threadsicher gemacht werden.
Generische Auflistungsklassen enthalten keine Synchronisierungsmember. Einige generische Klassen, beispielsweise Collection<T>, Dictionary<TKey, TValue> und List<T>, implementieren explizit Synchronisierungsmember, die von der nicht generischen ICollection-Schnittstelle vererbt werden.
Siehe auch
Referenz
System.Collections.Specialized