Я попытался создать ThreadSafeSortedDictionary
, и я работаю с .NET 4.0.C# ThreadSafeSortedDictionary Реализация с ограниченными методами
Я взглянул на Thread safe SortedDictionary, но не уверен в аспекте безопасности потока.
Любой думаю, что это может работать, или нет по причине я не могу видеть, связанные с:
- безопасности Thread - она должна быть потокобезопасными
- Производительность/эффективность - Я не главно обеспокоен это (если не существует огромная проблема с производительностью)
Мой код:
public class ThreadSafeSortedDict<TKey, TValue>
{
private readonly SortedDictionary<TKey, TValue> _dict;
private readonly ReaderWriterLockSlim _dictReaderWriterLockSlim;
private readonly ReaderWriterLockSlim _readonlyDictionaryLock;
public Dictionary<TKey, TValue> ReadOnly { get; set; }
public ThreadSafeSortedDict(IComparer<TKey> comparer)
{
_dict = new SortedDictionary<TKey, TValue>(comparer);
_dictReaderWriterLockSlim = new ReaderWriterLockSlim();
_readonlyDictionaryLock = new ReaderWriterLockSlim();
}
public void Add(TKey key, TValue value)
{
_dictReaderWriterLockSlim.EnterWriteLock();
try
{
_dict.Add(key,value);
}
finally
{
_dictReaderWriterLockSlim.ExitWriteLock();
}
SetReadOnlyDictionary();
}
public void AddRange(IEnumerable<KeyValuePair<TKey,TValue>> keyValues)
{
if (keyValues == null) return;
_dictReaderWriterLockSlim.EnterWriteLock();
try
{
foreach (var keyValue in keyValues)
{
Add(keyValue.Key, keyValue.Value);
}
}
finally
{
_dictReaderWriterLockSlim.ExitWriteLock();
}
SetReadOnlyDictionary();
}
public void Remove(TKey key)
{
_dictReaderWriterLockSlim.EnterWriteLock();
try
{
_dict.Remove(key);
}
finally
{
_dictReaderWriterLockSlim.ExitWriteLock();
}
SetReadOnlyDictionary();
}
public void Replace(IEnumerable<KeyValuePair<TKey, TValue>> newKeyValues)
{
if (newKeyValues == null) return;
_dictReaderWriterLockSlim.EnterWriteLock();
try
{
_dict.Clear();
AddRange(newKeyValues);
}
finally
{
_dictReaderWriterLockSlim.ExitWriteLock();
}
}
private void SetReadOnlyDictionary()
{
_readonlyDictionaryLock.EnterWriteLock();
try
{
ReadOnly = GetSortedKeyValues().ToDictionary(x => x.Key, x => x.Value);
}
finally
{
_readonlyDictionaryLock.ExitWriteLock();
}
}
private List<KeyValuePair<TKey, TValue>> GetSortedKeyValues()
{
_dictReaderWriterLockSlim.EnterReadLock();
try
{
return _dict.ToList();
}
finally
{
_dictReaderWriterLockSlim.ExitReadLock();
}
}
}
Если производительность не важна, почему бы не использовать ConcurentDictonary и GetSortedKeyValues сделать какие-то значения? –
Ок, думаю, я, вероятно, могу заменить SortedDictionary на ConcurrentDictionary. И затем сортируйте их, когда я устанавливаю словарь ReadOnly. Но потом я буду сортировать каждый раз, когда добавляю/удаляю что-то. Но это приведет к удалению некоторого кода при добавлении/удалении значений. – MajorInc
Вам не нужно сортировать по добавлению или удалению, вам нужно только сортировать, когда вам нужно экспортировать данные. –