<PackageReference Include="Castle.Windsor" Version="6.0.0" />

SlimUpgradeableReadLockHolder

using System; using System.Threading; namespace Castle.MicroKernel.Internal { internal class SlimUpgradeableReadLockHolder : IUpgradeableLockHolder, ILockHolder, IDisposable { private readonly ReaderWriterLockSlim locker; private SlimWriteLockHolder writerLock; private readonly bool wasLockAlreadySelf; public bool LockAcquired { get; set; } public SlimUpgradeableReadLockHolder(ReaderWriterLockSlim locker, bool waitForLock, bool wasLockAlreadySelf) { this.locker = locker; if (wasLockAlreadySelf) { LockAcquired = true; this.wasLockAlreadySelf = true; } else if (waitForLock) { locker.EnterUpgradeableReadLock(); LockAcquired = true; } else { LockAcquired = locker.TryEnterUpgradeableReadLock(0); } } public void Dispose() { if (writerLock != null && writerLock.LockAcquired) { writerLock.Dispose(); writerLock = null; } if (LockAcquired) { if (!wasLockAlreadySelf) locker.ExitUpgradeableReadLock(); LockAcquired = false; } } public ILockHolder Upgrade() { return Upgrade(true); } public ILockHolder Upgrade(bool waitForLock) { if (locker.IsWriteLockHeld) return NoOpLock.Lock; writerLock = new SlimWriteLockHolder(locker, waitForLock); return writerLock; } } }