SemaphoreSlim -是否可以在多个方法中使用它来等待和释放?



我有一个Asp.Net Core 6 Web Api

我有一个Singleton类,其中有几个方法。

我希望一次只有一个线程进入类的任何方法。

是否可以在构造函数中初始化SemaphoreSlim类并以以下方式在每个方法中使用它?这有什么危险吗?

是否有更好的方法来实现我正在寻找的?

public class Foo
{
private readonly SemaphoreSlim _sm;
public Foo()
{ 
_sm = new SemaphoreSlim(1, 1);
}
public async Task FirstMethod()
{
await _sm.WaitAsync();
//Do some work

_sm.Release();
}
public async Task SecondMethod()
{
await _sm.WaitAsync();
//Do some work

_sm.Release();
}
}

您应该采用try/catch/finalize模式—如果您这样做,您将非常安全:WaitAsync下的所有代码将按照max信号量的定义执行。只有当代码在信号量块下时,才会出现死锁——您可以考虑使用超时,但这通常是可以接受的。

public async Task SecondMethod()
{
await _sm.WaitAsync();
try
{
//Do some work
}

finally
{
//release in case of errors
_sm.Release();
}
}

另一个需要考虑的事情是,特别是如果它是一个长时间运行的进程,使用取消令牌来指示应用程序关闭。

还要记住,如果你从不同的线程中触发很多这样的方法,顺序是不能保证的——但是它们都会被处理。

最新更新