namespace Kit.Helpers { /// Сервис для синхронизации потоков по ключу на основе словаря в памяти приложения /// ключ синхронизации public class MemoryLockDictionaryService: ILockDictionaryService where TKey : notnull { private object _lockObjectLock; private IDictionary _lockObjects; public MemoryLockDictionaryService() { _lockObjectLock = new object(); _lockObjects = new Dictionary(); } private object GetLockObject(TKey lockKey) { lock (_lockObjectLock) { if (_lockObjects.ContainsKey(lockKey) == false) _lockObjects.Add(lockKey, new object()); return _lockObjects[lockKey]; } } private void RemoveLockObject(TKey lockKey) { // дожидаемся освобождения объекта lock (this.GetLockObject(lockKey)) { } // удаляем объект блокировки из очереди lock (_lockObjectLock) { _lockObjects.Remove(lockKey); } } public void ExecuteOnLock(TKey lockKey, Action action) { try { lock (GetLockObject(lockKey)) { action(); } RemoveLockObject(lockKey); } catch { throw; } finally { } } public TResult ExecuteOnLock(TKey lockKey, Func action) { try { lock (GetLockObject(lockKey)) { return action(); } } catch { throw; } finally { RemoveLockObject(lockKey); } } } }