C# 信号量未按预期工作,无法找出原因

我正在用 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 上运行。


我已经多次阅读这段代码,但不明白为什么它不起作用。


任何帮助将不胜感激。


aluckdog
浏览 57回答 1
1回答

Qyouu

可能您的后端正在由多个w3wp.exe工作进程提供服务。因为您的信号量是在没有名称的情况下创建的,所以它是一个“本地”信号量(每个进程的本地),而不是“全局”信号量(系统范围):信号量有两种类型:本地信号量和命名系统信号量。如果使用接受名称的构造函数创建 Semaphore 对象,则它会与该名称的操作系统信号量相关联。命名系统信号量在整个操作系统中都是可见的,并且可用于同步进程的活动。您可以创建多个代表同一个命名系统信号量的 Semaphore 对象,并且可以使用 OpenExisting 方法打开现有的命名系统信号量。本地信号量仅存在于您的进程中。它可以被进程中任何引用本地信号量对象的线程使用。每个信号量对象都是一个单独的本地信号量。
打开App,查看更多内容
随时随地看视频慕课网APP