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);
}
}
}
}