using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SunlightCentralizedControlManagement_SCCM_.UserClass { /// /// 使用using代替lock操作的对象,可指定写入和读取锁定模式 /// public sealed class ClsLock { #region 内部类 /// /// 利用IDisposable的using语法糖方便的释放锁定操作内部类 /// private struct Lock : IDisposable { /// /// 读写锁对象 /// private readonly ReaderWriterLockSlim _Lock; /// /// 是否为写入模式 /// private bool _IsWrite; /// /// 利用IDisposable的using语法糖方便的释放锁定操作构造函数 /// /// 读写锁 /// 写入模式为true,读取模式为false public Lock(ReaderWriterLockSlim rwl, bool isWrite) { _Lock = rwl; _IsWrite = isWrite; } /// /// 释放对象时退出指定锁定模式 /// public void Dispose() { if (_IsWrite) { if (_Lock.IsWriteLockHeld) { _Lock.ExitWriteLock(); } } else { if (_Lock.IsReadLockHeld) { _Lock.ExitReadLock(); } } } } /// /// 空的可释放对象,免去了调用时需要判断是否为null的问题内部类 /// private class Disposable : IDisposable { /// /// 空的可释放对象 /// public static readonly Disposable Empty = new Disposable(); /// /// 空的释放方法 /// public void Dispose() { } } #endregion /// /// 读写锁 /// private readonly ReaderWriterLockSlim _LockSlim = new ReaderWriterLockSlim(); /// /// 使用using代替lock操作的对象,可指定写入和读取锁定模式构造函数 /// public ClsLock() { Enabled = true; } /// /// 是否启用,当该值为false时,Read()和Write()方法将返回 Disposable.Empty /// public bool Enabled { get; set; } /// /// 进入读取锁定模式,该模式下允许多个读操作同时进行, /// 退出读锁请将返回对象释放,建议使用using语块, /// Enabled为false时,返回Disposable.Empty, /// 在读取或写入锁定模式下重复执行,返回Disposable.Empty; /// public IDisposable Read() { if (Enabled == false || _LockSlim.IsReadLockHeld || _LockSlim.IsWriteLockHeld) { return Disposable.Empty; } else { _LockSlim.EnterReadLock(); return new Lock(_LockSlim, false); } } /// /// 进入写入锁定模式,该模式下只允许同时执行一个读操作, /// 退出读锁请将返回对象释放,建议使用using语块, /// Enabled为false时,返回Disposable.Empty, /// 在写入锁定模式下重复执行,返回Disposable.Empty /// /// 读取模式下不能进入写入锁定状态 public IDisposable Write() { if (Enabled == false || _LockSlim.IsWriteLockHeld) { return Disposable.Empty; } else if (_LockSlim.IsReadLockHeld) { throw new NotImplementedException("读取模式下不能进入写入锁定状态"); } else { _LockSlim.EnterWriteLock(); return new Lock(_LockSlim, true); } } } }