我正在用 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 方法打开现有的命名系统信号量。
本地信号量仅存在于您的进程中。它可以被进程中任何引用本地信号量对象的线程使用。每个信号量对象都是一个单独的本地信号量。
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报
0/150
提交
取消