(エッセンス)2020年6月27日C#クラスライブラリ読み書きロックヘルプクラス


using System; using System.Threading; namespace Core.Util { /// /// using lock , /// :https://www.cnblogs.com/blqw/p/3475734.html /// /// public class UsingLock<T> : IDisposable { #region /// IDisposable using /// /// private struct Lock : IDisposable { /// /// private 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 ReaderWriterLockSlim _LockSlim = new ReaderWriterLockSlim(); /// /// private T _Data; /// using lock , /// /// public UsingLock() { Enabled = true; } public UsingLock(T data) { Enabled = true; _Data = data; } /// /// /// /// public T Data { get { if (_LockSlim.IsReadLockHeld || _LockSlim.IsWriteLockHeld) { return _Data; } throw new MemberAccessException(" "); } set { if (_LockSlim.IsWriteLockHeld == false) { throw new MemberAccessException(" Data "); } _Data = value; } } /// , 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); } } public void Dispose() { _LockSlim.Dispose(); } } }