Чӣ гуна метавон Dictionary-ро бидуни истифодаи ConcurrentDictionary амалӣ кард?
sobes.tech AI
Ҷавоб аз AI
Барои татбиқи луғати бехатари потокӣ бе истифодаи ConcurrentDictionary, метавон аз primitives-и синхронӣ аз namespace-и System.Threading истифода бурд.
Равишҳои асосӣ:
-
Блок кардани тамоми луғат (
lock): Ҳамаи амалҳои хондан ва навиштанро дар як блокиlockбо истифода аз як объекти ҳамоҳангсозӣ пӯшонед.// Объект барои ҳамоҳангсозии дастрасӣ ба луғат private readonly object _lockObject = new object(); private readonly Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>(); public void AddOrUpdate(TKey key, TValue value) { lock (_lockObject) { if (_dictionary.ContainsKey(key)) { _dictionary[key] = value; } else { _dictionary.Add(key, value); } } } public bool TryGetValue(TKey key, out TValue value) { lock (_lockObject) { return _dictionary.TryGetValue(key, out value); } } public bool TryRemove(TKey key, out TValue value) { lock (_lockObject) { if (_dictionary.TryGetValue(key, out value)) { _dictionary.Remove(key); return true; } return false; } }Фоидаҳо: Иҷрои содда. Зиёнҳо: Ҳамзамон дар иҷрои баланд, зеро дастрасӣ ба тамоми луғат ҳатто дар вақти хондан низ баста мешавад.
-
Истифодаи
ReaderWriterLockSlim: Имкон медиҳад, ки блокировкаҳо барои амалҳои хондан ва навиштан ҷудо шаванд. Бисёре аз равандҳо метавонанд ҳамзамон хонанд, аммо танҳо як раванд метавонад нависад.private readonly ReaderWriterLockSlim _lockSlim = new ReaderWriterLockSlim(); private readonly Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>(); public void AddOrUpdate(TKey key, TValue value) { _lockSlim.EnterWriteLock(); try { if (_dictionary.ContainsKey(key)) { _dictionary[key] = value; } else { _dictionary.Add(key, value); } } finally { _lockSlim.ExitWriteLock(); } } public bool TryGetValue(TKey key, out TValue value) { _lockSlim.EnterReadLock(); try { return _dictionary.TryGetValue(key, out value); } finally { _lockSlim.ExitReadLock(); } } public bool TryRemove(TKey key, out TValue value) { _lockSlim.EnterWriteLock(); try { if (_dictionary.TryGetValue(key, out value)) { _dictionary.Remove(key); return true; } return false; } finally { _lockSlim.ExitWriteLock(); } }Фоидаҳо: Беҳтар кардани иҷро дар муқоиса бо
lockдар ҳолатҳои зиёд шудани амалҳои хондан. Зиёнҳо: Иҷрои мураккабтар дар муқоиса боlockоддӣ.
Ин равишҳо аз рӯи хусусиятҳои истифодаи луғат, нисбати амалҳои хондан ва навиштан, ва талаботи иҷро интихоб карда мешаванд. ReaderWriterLockSlim одатан дар ҳолатҳои зиёд будани амалҳои хондан беҳтар аст.