异步方法内无法使用Monitor 和lock
所以只能用System.Threading.SemaphoreSlim了
//Semaphore (int initialCount, int maximumCount);
//initialCount代表还分配几个线程,比如是1,那就是还能允许一个线程继续跑锁起来的代码
//maximumCount代表最大允许数,比如是1,那就是进去1个线程,就会锁起来
System.Threading.SemaphoreSlim slimlock = new SemaphoreSlim(1, 1);
await slimlock.WaitAsync();
try
{
await Task.Delay(3000);
}
finally
{
slimlock.Release();
}
而Monitor和lock只能用在非异步上面
//1.Monitor
object lockObject= new object();
bool acquiredLock = false;
try
{
Monitor.TryEnter(lockObject, ref acquiredLock);
if (acquiredLock)
{
// Code that accesses resources that are protected by the lock.
}
else
{
// Code to deal with the fact that the lock was not acquired.
}
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}
//2.Monitor lock
//Monitor
try
{
Monitor.Enter(lockObject);
// Code that accesses resources that are protected by the lock.
}
finally
{
Monitor.Exit(lockObject);
}
//lock:
lock(lockObject)
{
//Code that accesses resources that are protected by the lock.
}
上述2两个加锁的例子完全是等价的,都是在非异步的时候锁定某段代码
作者:牧场小明
链接:https://www.jianshu.com/p/1609c50279ac
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。