异步方法内无法使用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.Monitorobject 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//Monitortry{
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两个加锁的例子完全是等价的,都是在非异步的时候锁定某段代码。