Возможно ли, что критическая область основана на условии?

У меня есть веб-сайт, на котором frontend auto сохраняет данные, введенные в бэкэнд. Возможно, что они сохраняются, возможно, очень близко друг к другу, и я хочу заблокировать сохранение результатов на основе каждого пользователя.

Я не хочу использовать простой "блокировку", так как это заблокирует всех пользователей, пытающихся сохранить.

Есть ли способ сделать это в.NET?

1 ответ

Наличие объекта блокировки для каждого пользователя звучит разумно. Я также рекомендую вам использовать Monitor.TryEnter вместо блокировки и просто пропустить сохранение, если уже выполняется сохранение. Что-то вроде этого:

static ConcurrentDictionary<string, object=""> _locksByUser = new ConcurrentDictionary<string, object="">();

public void Save(string userId) {
 var lock = _locksByUser.GetOrAdd(userId, new object());
 if (Monitor.TryEnter(lock)) {
 try {
 //do save here
 }
 finally {
 Monitor.Exit(lock);
 }
 }
}
</string,></string,>

licensed under cc by-sa 3.0 with attribution.