using System.Collections.Generic;
using System.Threading.Tasks;
private static readonly Dictionary<string, SemaphoreSlim> _fileHashes = new Dictionary<string, SemaphoreSlim>();
public static void Main()
var fileHashes = new[] { "123", "123", "222", "223", "123" };
foreach (var fileHash in fileHashes)
Task.Run(() => DoSomeWork(fileHash));
private static void DoSomeWork(string fileHash)
if (_fileHashes.ContainsKey(fileHash))
var sem = _fileHashes[fileHash];
var sem = new SemaphoreSlim(1);
_fileHashes.Remove(fileHash);