Вы ищете семафор. Ключевое слово lock
является самым базовым из семафоров, но вы также можете использовать Semaphore
/ SemaphoreSlim
, которые предоставляют возможность делать такие вещи, как ограничение скорости, тогда как lock
будет буквально открывать по одной операции за раз. Тем не менее, ваша цель состоит в том, чтобы ставить по одной операции за раз, для определенного ресурса , что делает SemaphoreSlim
лучшим выбором, в частности ConcurrentDictionary<string, SemaphoreSlim>
.
Вам понадобится класс с единичным временем жизни (один экземпляр на всю жизнь приложения). Там вы добавите ивар:
private readonly ConcurrentDictionary<string, SemaphoreSlim> _semaphores = new ConcurrentDictionary<string, SemaphoreSlim>();
Затем вы добавите следующий код вокруг операции, которую вы хотите использовать:
var semaphore = _semaphores.GetOrAdd("object3", _ => new SemaphoreSlim(1, 1));
await semaphore.WaitAsync();
// do something
semaphore.Release();
"object3"
там, очевидно, просто заполнитель. Вы захотите использовать все, что имеет смысл (идентификатор и т. Д.) - то, что однозначно идентифицирует конкретный ресурс, который вы получаете. Тогда он будет содержать операции только для этого конкретного ресурса, если на этом конкретном ресурсе уже существует операция. Другой ресурс получит свой семафор и, следовательно, свои ворота.