Um semáforo dentro de um método de serviço com escopo definido dá acesso apenas a uma pessoa por vez?
public class MyScopedService
{
private readonly SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
public async Task SomeMethod()
{
await semaphore.WaitAsync();
try
{
// Access the shared resource here
}
finally
{
semaphore.Release();
}
}
}
cadastre-se no DI:
services.AddScoped<MyScopedService>();
Depende muito de como você executa o código e de como hospeda seu aplicativo.
SomeMethod
é invocado pelo chamador várias vezes em paralelo. Em seguida, o semáforo limitaria o acesso ao recurso compartilhado, pois você usaria a mesma instânciaMyScopedService
e, portanto, usaria o mesmo semáforo e ocorreria a limitação.Se você quiser que o thottlong funcione em todo o aplicativo, você precisará ter alguns shared
Semaphore
, que seriam do aplicativo, ou procurar outras maneiras (lock
,Monitor
classe). Ou você poderia ter uma classe singleton com o semáforo, que cuidaria da invocação do método.MAS nada acima funcionaria se o código pudesse ser executado por várias instâncias (por exemplo, se você estiver hospedando o aplicativo na nuvem e tiver várias instâncias do aplicativo). Então você precisaria aplicar bloqueios distribuídos, eu recomendo fortemente este pacote nuget .
Não, porque você cria um novo
SemaphoreSlim
para cadaScopedService
instância e tem escopo limitado, ou seja, um novoScopedService
e um novoSemaphoreSlim
são criados para cada solicitação. Se você deseja um semáforo que dê acesso apenas a uma pessoa (solicitação) por vez, será necessário criá-lo em um serviço que esteja vinculado ao escopo global (um singleton).