为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
aluckdog 2023-09-24 16:18:01
我正在用 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 上运行。我已经多次阅读这段代码,但不明白为什么它不起作用。任何帮助将不胜感激。
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

可能您的后端正在由多个w3wp.exe工作进程提供服务。因为您的信号量是在没有名称的情况下创建的,所以它是一个“本地”信号量(每个进程的本地),而不是“全局”信号量(系统范围):

信号量有两种类型:本地信号量和命名系统信号量。如果使用接受名称的构造函数创建 Semaphore 对象,则它会与该名称的操作系统信号量相关联。命名系统信号量在整个操作系统中都是可见的,并且可用于同步进程的活动。您可以创建多个代表同一个命名系统信号量的 Semaphore 对象,并且可以使用 OpenExisting 方法打开现有的命名系统信号量。

本地信号量仅存在于您的进程中。它可以被进程中任何引用本地信号量对象的线程使用。每个信号量对象都是一个单独的本地信号量。


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 55 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信