如何在C#中实现单用户并发访问限制?
按用户ID实现并发控制的C#方案
我需要确保同一段代码不会被同一用户并发执行多次,但不同用户可以正常并发访问这段代码。
目前我知道C#里使用lock会实现全局锁定,同一时间只能有单个用户执行代码段:
lock (privateObjectLock) { // 需要控制并发的代码 }
我的核心需求是:不同用户(user1、user2……userN)可以同时进入目标代码区域,但同一个用户不能同时执行多次这段代码。
举个场景,处理用户购买请求时的逻辑:
if (balanceAvailableOfAUser) { UserCanBuy(); DeductAmount(); }
从SQL Server层面可以通过serializable隔离级别或者乐观并发机制解决这个问题,但我想知道C#端有没有对应的实现方式。
更新1:实现代码
基于思路,我编写了以下用户级别的并发控制类:
public class UserLocker { static readonly ConcurrentDictionary<int, SemaphoreSlim> _semaphores = new(); public static async Task<T> LockAsync<T>(int userId, Func<Task<T>> worker) { var semaphore = _semaphores.GetOrAdd(userId, new SemaphoreSlim(1, 1)); await semaphore.WaitAsync(); try { return await worker(); } finally { semaphore.Release(); _semaphores.TryRemove(userId, out semaphore); } } }
调用示例
var response = await UserLocker.LockAsync(user.Id, async () => { if (user.SomCondition) { ModelState.AddModelError("AddSomeError", "AddSomeError"); return null; } var response = SaveSomeThing(); return response; }); if (response == null) { return BadRequest(new ValidationProblemDetails(ModelState)); } return Ok(response);
内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch
相关产品推荐
相关产品推荐

