(エッセンス)2020年6月27日C#クラスライブラリ読み書きロックヘルプクラス
17565 ワード
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();
}
}
}