.NET 4.5, Windows Mağaza uygulamaları ve Windows Phone 8'yi hedefleyen bir taşınabilir sınıf kitaplığı yazıyorum. Etkin bir bellek içi önbellek mekanizmasına ihtiyacım var, bu yüzden ConcurrentDictionary<K,V>
'u kullanmayı düşünüyordum, ama WP8'de mevcut değil.Taşınabilir sınıf kitaplığı için ConcurrentDictionary için alternatif
Çok sayıda okunacak ve nispeten az sayıda yazı olacak, bu yüzden ideal olarak birden çok iş parçacığı için kilitlenmeyen okumaları destekleyen bir koleksiyonu ve tek bir iş parçacığıyla yazmak istiyorum. Jenerik olmayan Hashtable
bu mülke sahiptir, according to MSDN, ancak maalesef PCL'de mevcut değildir ...
PCL'de bu gereksinimle eşleşen başka bir koleksiyon sınıfı var mı? Aksi halde, okuyucuyu okumadan kilitlemeden elde etmek için iyi bir yol ne olurdu? (Çok sık olmaz çünkü yazma işlemleri için kilitleme, Tamam)
DÜZENLEME: JaredPar rehberliğinde sayesinde, sonunda Microsoft.Bcl.Immutable den ImmutableDictionary<TKey, TValue>
kullanarak, tamamen kilidi serbest biçimde Önbelleğimi uygulanan:
class Cache<TKey, TValue>
{
private IImmutableDictionary<TKey, TValue> _cache = ImmutableDictionary.Create<TKey, TValue>();
public TValue GetOrAdd(TKey key, [NotNull] Func<TKey, TValue> valueFactory)
{
valueFactory.CheckArgumentNull("valueFactory");
TValue newValue = default(TValue);
bool newValueCreated = false;
while (true)
{
var oldCache = _cache;
TValue value;
if (oldCache.TryGetValue(key, out value))
return value;
// Value not found; create it if necessary
if (!newValueCreated)
{
newValue = valueFactory(key);
newValueCreated = true;
}
// Add the new value to the cache
var newCache = oldCache.Add(key, newValue);
if (Interlocked.CompareExchange(ref _cache, newCache, oldCache) == oldCache)
{
// Cache successfully written
return newValue;
}
// Failed to write the new cache because another thread
// already changed it; try again.
}
}
public void Clear()
{
_cache = _cache.Clear();
}
}
Değişmez bir ağaç içeren bir yazı yazmayı düşündünüz mü ve CAS yazıyor mu? Bu size kilitsiz okumalar verecek, CAS yazdı ve http://blogs.msdn.com/b/ericlippert/archive/2008/01/21/immutability-in- destek yapısı olarak Eric'in değişmez AVL ağacını kullanabiliyordunuz. c-bölüm-dokuz-akademik-artı-benim-avl-ağaç-application.aspx – JaredPar
@JaredPar, "CAS" nedir? –
CAS = Karşılaştırma ve takas. – JaredPar