繁体   English   中英

C#信号灯无法正常工作,无法弄清原因

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM