[英]C# Semaphores not working as expected, cannot figure out why
我正在用C#构建ASP.NET(.NET Framework)应用程序,正在对称为“ LinuxDocker”的后端服务进行API调用,并且试图限制从ASP.NET应用程序对其进行12个并发调用的次数。 这是我写的代码:
private static Semaphore LinuxDockerSemaphore = new Semaphore(12, 12);
public static SemaphoreWaiter WaitForLinuxDocker(int timeoutMS = -1)
{
return new SemaphoreWaiter(LinuxDockerSemaphore, timeoutMS);
}
public class SemaphoreWaiter : IDisposable
{
Semaphore Slim;
public SemaphoreWaiter(Semaphore slim, int timeoutMS = -1)
{
Slim = slim;
Slim.WaitOne(timeoutMS);
}
public void Dispose()
{
Slim.Release();
}
}
然后,当我调用后端服务时,我会像这样:
using (ConcurrencyManager.WaitForLinuxDocker())
{
// Call backend service here
}
因此看来这应该限制为12个并发调用,但是当我从具有100个并发调用的集成测试中对其进行测试时,它基本上一次仅允许1个请求通过,一次不允许12个调用。
该服务在Windows Server 2016和.NET Framework 4.7的IIS上运行。
我已经多次阅读此代码,无法弄清楚为什么它不起作用。
任何帮助将不胜感激。
可能您的后端由多个w3wp.exe
工作进程提供服务。 因为您的信号灯是不带名称的创建的,所以它是“本地”信号灯(对于每个进程都是本地的),而不是“全局”信号灯(系统范围内):
信号量有两种类型:局部信号量和命名系统信号量。 如果使用接受名称的构造函数创建Semaphore对象,则该对象将与该名称的操作系统信号灯关联。 命名的系统信号在整个操作系统中都是可见的,并且可以用于同步进程的活动。 您可以创建代表相同命名系统信号量的多个Semaphore对象,并且可以使用OpenExisting方法打开现有的命名系统信号量。
本地信号灯仅存在于您的进程中。 进程中任何引用了本地Semaphore对象的线程都可以使用它。 每个信号量对象都是一个单独的本地信号量。
REF: 信号量类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.