【发布时间】:2019-05-23 21:24:13
【问题描述】:
我正在实现一个限制可以发送的最大请求数的流量控制组件。每个工作线程都可以发送单个请求或一批请求,但任何时候待处理请求的总数都不应超过最大数量。
我最初想用 SemaphoreSlim 实现: 将信号量初始化为最大请求计数,然后当工作线程要调用服务时,它必须获取足够的令牌计数,但是我发现实际上 SemaphoreSlim 和 Semaphore 只允许线程将信号量计数减少 1,在我的情况下,我想通过工作线程携带的请求数来减少计数。
我应该在这里使用什么同步原语?
澄清一下,该服务支持批处理,因此一个线程可以在一次服务调用中发送 N 个请求,但相应地它应该能够将信号量的当前计数减少 N。
【问题讨论】:
-
为什么不
Wait为您要发出的每个预期请求提供信号量? -
@JonathonChase 我的服务支持批处理,所以它是一个服务调用。您是否建议在同一个线程中多次调用 SemaphoreSlim.Wait()?
-
一个线程如何同时处理多个请求?你使用 async/await 吗?
-
@ThomasWeller 上面我提到过,我的服务支持批处理,所以如果一个工作线程携带多个请求,它会直接调用服务的批处理端点。
-
是的,但一次只针对一个请求。因此它获取 1 个令牌的信号量,并处理 1 个请求。它可以保留该 1 个令牌并处理另一个 1 个请求。只要它愿意,就可以重复。有什么问题吗?
标签: c# multithreading thread-synchronization