当不断有多个呼叫者等待进入时,SemaphoreSlim是否保证进入

时间:2019-08-29 09:59:05

标签: c# .net async-await locking semaphore

说我有一个SemaphoreSlim来限制对这样的外部API的并发调用:

private static readonly SemaphoreSlim semaphoreSlim = new SemaphoreSlim(10);

public async Task<HttpResponseMessage> SendApiRequest(HttpRequestMessage request)
{
    using (await semaphoreSlim.WaitAsync())
        return await SendRequestToAPI(request);
}

如果对API的调用次数使得没有长时间等待的调用者,但始终有至少两个调用者等待,那么是否保证所有调用者最终都能通过?还是一个请求是“不幸的”,而在另一个调用者释放该信号量时再也不会被选择输入?

1 个答案:

答案 0 :(得分:2)

根据documentation

  

如果多个线程被阻止,则没有保证的顺序,例如   FIFO或LIFO,用于控制线程何时进入信号量。

是的,一个请求可能很不幸,而且永远都不会被选择。