Ich schreibe eine portable Klassenbibliothek, die auf .NET 4.5, Windows Store-Apps und Windows Phone 8 abzielt. Ich brauche einen effizienten speicherinternen Cache-Mechanismus, also habe ich über ConcurrentDictionary<K,V>
nachgedacht, aber es ist nicht verfügbar in WP8.
Es wird viele Lesevorgänge und relativ wenige Schreibvorgänge geben. Daher möchte ich idealerweise eine Sammlung, die schreibgeschützte Lesevorgänge aus mehreren Threads unterstützt und nach einem einzelnen Thread schreibt. Das nicht-generische Hashtable
hat diese Eigenschaft, laut MSDN , aber Leider ist es nicht in der PCL verfügbar ...
Gibt es in der PCL eine andere Auflistungsklasse, die dieser Anforderung entspricht? Wenn nicht, was wäre ein guter Weg, Gewindesicherheit zu erreichen, ohne für Lesevorgänge zu sperren? (Sperren für Schreibvorgänge ist in Ordnung, da es nicht allzu oft passieren wird)
BEARBEITEN: Dank der Anleitung von JaredPar habe ich meinen Cache schließlich völlig frei von Sperren implementiert, indem ich ImmutableDictionary<TKey, TValue>
von Microsoft.BCl.Immutable :
Eine Option, die in Betracht gezogen werden sollte, ist, eine dünne Fassade über einen unveränderlichen Suchbaum zu schreiben. Es gibt mehrere unveränderliche Suchbäume, die im Internet zur Auswahl stehen. Ich stütze mich in der Regel von Eric Lipperts tollem Beitrag zum Thema
ab Wenn Sie dies als Backing-Datenstruktur verwenden, erhalten Sie eine Sperre frei. Schreibzugriffe auf den Baum können auch in lockfreier Weise mit CAS durchgeführt werden. Dies wird etwas langsamer als ConcurrentDictionary
sein, da Suchvorgänge O (Log (N)) sind, anstatt sich O (1) zu nähern. Aber es sollte den Trick für dich tun
Tags und Links c# thread-safety caching concurrency collections