我有一个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();
}
}
另一个需要考虑的事情是,特别是如果它是一个长时间运行的进程,使用取消令牌来指示应用程序关闭。
还要记住,如果你从不同的线程中触发很多这样的方法,顺序是不能保证的——但是它们都会被处理。