public async Task <Sema> GetLockObject(string topic) { lock (locks) { if (!locks.ContainsKey(topic)) { locks.Add(topic, new SemaphoreSlim(1, 1)); } } var sema = new Sema(locks[topic]); await sema.Wait(); return(sema); }