我正在编写一个面向.NET 4.5,Windows应用商店应用程序和Windows Phone 8的可移植类库.我需要一个高效的内存缓存机制,因此我在考虑使用ConcurrentDictionary<K,V>,但它在WP8中不可用.
将有许多读取和相对较少的写入,所以理想情况下我想要一个支持来自多个线程的无锁读取的集合,并由单个线程写入.根据MSDN,非泛型Hashtable具有该属性,但不幸的是它在PCL中不可用...
PCL中是否有另一个符合此要求的集合类?如果没有,那么在不锁定读取的情况下实现线程安全的好方法是什么?(锁定写入是可以的,因为它不会经常发生)
编辑:感谢JaredPar的指导下,我终于实现我的缓存在一个完全无锁的方式,利用ImmutableDictionary<TKey, TValue>从Microsoft.Bcl.Immutable:
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;
} …Run Code Online (Sandbox Code Playgroud)