【发布时间】:2019-12-31 05:38:18
【问题描述】:
我正在用 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 上运行。
我已多次阅读此代码,但无法弄清楚为什么它不起作用。
任何帮助将不胜感激。
【问题讨论】:
-
您正在通过调用
WaitOne阻塞当前线程。您可能会遇到线程池饥饿的情况,由于阻塞,根本没有足够的线程来响应调用。这可能 看起来 像信号量工作不正常。我会更改为SemaphoreSlim并使用WaitAsync -
@JohanP 感谢您的反馈。 FWIW 我实际上首先尝试了 SemaphoreSlim,当它不起作用时,我尝试了 Semaphore。两者都创建了完全相同的结果(未按预期工作)。
标签: c# asp.net multithreading concurrency semaphore