using System; namespace Wayne.Lib { /// /// Utility Base class that manages the disposable pattern. /// Note that it only invokes the DoDispose when called from /// explicit Dispose call. If called from finalizer, this is not called. /// public abstract class DisposableBase : IDisposable { private readonly object disposedLock = new object(); private bool disposed; private bool disposeRunning; ~DisposableBase() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (disposing) { lock (disposedLock) { if (disposed || disposeRunning) { return; } disposeRunning = true; } try { DoDispose(); } finally { lock (disposedLock) { disposed = true; disposeRunning = false; } } } } protected bool IsDisposed { get { return disposed || disposeRunning; } } /// /// Method that /// protected abstract void DoDispose(); } }