using System; using System.Threading; namespace Nop.Core.ComponentModel { /// /// Provides a convenience methodology for implementing locked access to resources. /// /// /// Intended as an infrastructure class. /// public class ReaderWriteLockDisposable : IDisposable { private bool _disposed = false; private readonly ReaderWriterLockSlim _rwLock; private readonly ReaderWriteLockType _readerWriteLockType; /// /// Initializes a new instance of the class. /// /// The readers–writer lock /// Lock type public ReaderWriteLockDisposable(ReaderWriterLockSlim rwLock, ReaderWriteLockType readerWriteLockType = ReaderWriteLockType.Write) { _rwLock = rwLock; _readerWriteLockType = readerWriteLockType; switch (_readerWriteLockType) { case ReaderWriteLockType.Read: _rwLock.EnterReadLock(); break; case ReaderWriteLockType.Write: _rwLock.EnterWriteLock(); break; case ReaderWriteLockType.UpgradeableRead: _rwLock.EnterUpgradeableReadLock(); break; } } // Public implementation of Dispose pattern callable by consumers. public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } // Protected implementation of Dispose pattern. protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { switch (_readerWriteLockType) { case ReaderWriteLockType.Read: _rwLock.ExitReadLock(); break; case ReaderWriteLockType.Write: _rwLock.ExitWriteLock(); break; case ReaderWriteLockType.UpgradeableRead: _rwLock.ExitUpgradeableReadLock(); break; } } _disposed = true; } } }