You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:06:22