У меня есть вопрос о том, как реализовать список / словарь так, чтобы он не блокировался во время чтения и блокировался во время записи.Пример моего кода из проекта GitHub: TextProcessorsCache.cs
/// <summary>
/// Cache of text processors that can be re-used as they do not have
/// state
/// </summary>
public static class TextProcessorsCache
{
private static readonly ConcurrentDictionary<Type, ITextProcessor> cache;
static TextProcessorsCache()
{
cache = new ConcurrentDictionary<Type, ITextProcessor>();
}
public static ITextProcessor GetInstance<T>() where T: class, ITextProcessor, new()
{
return cache.GetOrAdd(typeof(T), new T());
}
}
Я хочу избавиться от поля ConcurrentDictionary<Type,ITextProcessor>
, вместо этого я хочу, чтобы любые вызовы для кэширования проверяли наличие значенияпо ключу, но для записи он заблокирует и приостановит все чтения, пока значение не будет записано в словарь
Impl с ReaderWriterLock.
public static class TextProcessorsCache
{
private static readonly Dictionary<Type, ITextProcessor> cache;
private static ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
static TextProcessorsCache()
{
cache = new Dictionary<Type, ITextProcessor>();
}
public static ITextProcessor GetInstance<T>() where T: class, ITextProcessor, new()
{
ITextProcessor processor;
locker.EnterReadLock();
cache.TryGetValue(typeof(T), out processor);
locker.ExitReadLock();
if (processor == null)
{
locker.EnterWriteLock();
if (cache.TryGetValue(typeof(T), out processor))
{
locker.ExitWriteLock();
return processor;
}
processor = new T();
cache[typeof(T)] = processor;
locker.ExitWriteLock();
}
return processor;
}
}