使用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
如果最先发起的是第一或者第二个请求,它们不会被浏览器认为是并发而是会被排队,在它们两个中的一个返回后,浏览器会再次发起另一个请求,所以后台收到的请求不是并发过来的。如果最先发起的是三、四、五中个任何一个,则只有最先发起的请求会被执行,在信号量释放之前,后面发起的请求都会被拦截。

浙公网安备 33010602011771号