使用SemaphoreSlim控制并发数

/// <summary>
/// 信号量锁,initialCount限制同时处理数量。
/// </summary>
static readonly SemaphoreSlim _lock = new SemaphoreSlim(1);

public async Task<ActionResult> TestSlim(string name)
{
    //传0时如果信号量不可用,不会等待,立即返回false,否则返回true。
    if (!await _lock.WaitAsync(0))
    {
        return Content($"劳资很忙,晚点再来!");
    }
    try
    {
        await Task.Delay(5000);//模拟执行任务
        return Content($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}--->任务{name}完成了...");
    }
    finally
    {
        _lock.Release();
    }
}

当多个请求参数都相同时,请为每个请求添加一个随机参数,因为
浏览器会复用连接:相同域名下的请求,浏览器会复用 TCP 连接。
请求排队:浏览器会对相同 URL 的请求进行排队,避免并发。
结果:第二个请求会等待第一个请求完成,所以不会出现真正的并发。
例如下面五个请求:
请求一:/TestSlim/name=1
请求二:/TestSlim/name=1
请求三:/TestSlim/name=1&=65431321
请求四:/TestSlim/name=1&
=13578965
请求五:/TestSlim/name=2
如果最先发起的是第一或者第二个请求,它们不会被浏览器认为是并发而是会被排队,在它们两个中的一个返回后,浏览器会再次发起另一个请求,所以后台收到的请求不是并发过来的。如果最先发起的是三、四、五中个任何一个,则只有最先发起的请求会被执行,在信号量释放之前,后面发起的请求都会被拦截。

posted @ 2025-10-21 16:29  牛仔很肥  阅读(2)  评论(0)    收藏  举报