Alternative zu ConcurrentDictionary für die portable Klassenbibliothek

9

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 :

%Vor%     
Thomas Levesque 21.08.2013, 21:15
quelle

1 Antwort

4

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

    
JaredPar 21.08.2013, 23:38
quelle