作用域服务方法内的信号量是否一次只允许一个人访问?
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();
}
}
}
在 DI 中注册:
services.AddScoped<MyScopedService>();
这在很大程度上取决于您如何执行代码以及如何托管应用程序。
SomeMethod
由调用者并行调用多次。然后,信号量将限制对共享资源的访问,因为您将使用相同的实例,MyScopedService
因此,您将使用相同的信号量,并且会发生限制。如果您希望 thottlong 在整个应用程序中工作,您将需要一些共享
Semaphore
,这将是应用程序方面的,或者考虑其他方式(lock
,Monitor
类)。或者您可以使用带有信号量的单例类,它将负责调用该方法。但如果代码可以由多个实例执行(例如,如果您在云中托管应用程序并拥有该应用程序的多个实例),则上述方法都不起作用。然后你需要应用分布式锁,我强烈推荐这个nuget包。
SemaphoreSlim
不,因为您为每个实例创建一个新实例ScopedService
,并且它的范围是有限的,即为每个请求创建ScopedService
一个新实例。SemaphoreSlim
如果您想要一个信号量一次只向一个人(请求)提供访问权限,则需要在绑定在全局范围内的服务(单例)中创建它。