public bool TryDowngradeToReadLock(TimeSpan timeout, out IReadLockAcquisition readLockAcquisition)
            {
                var disposables = (IDisposable)null;

                var ok = Owner.TryLockChildren(LockTypes.Read, timeout, out disposables);

                if (ok)
                {
                    ok = Owner.InternalLock.TryEnterReadLock(timeout.Milliseconds);

                    if (ok)
                    {
                        readLockAcquisition = new ReadLockAcquisition(Owner, disposables);

                        return true;
                    }
                    else
                    {
                        disposables?.Dispose();
                    }
                }

                readLockAcquisition = null;
                return false;
            }
 public override bool TryAcquireReadLock(TimeSpan timeout, out IReadLockAcquisition readLockAcquisition)
 {
     var sw = Stopwatch.StartNew();
     var r = base.TryAcquireReadLock(timeout, out readLockAcquisition);
     sw.Stop();
     SUBJECT__Read.OnNext(sw.Elapsed.TotalMilliseconds);
     return r;
 }
            public bool TryDowngradeToReadLock(TimeSpan timeout, out IReadLockAcquisition readLockAcquisition)
            {
                if(Owner.InternalLock.TryEnterReadLock(timeout.Milliseconds))
                {
                    readLockAcquisition = new ReadLockAcquisition(Owner);

                    return true;
                }
                else
                {
                    readLockAcquisition = null;
                    return false;
                }
            }
        public bool TryAcquireReadLock(TimeSpan timeout, out IReadLockAcquisition readLockAcquisition)
        {
            if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                readLockAcquisition = null;
                return false;
            }

            if (InternalLock.TryEnterReadLock(timeout))
            {
                readLockAcquisition = new ReadLockAcquisition(owner: this);
                return true;
            }
            else
            {
                readLockAcquisition = null;
                return false;
            }
            
        }
        public virtual bool TryAcquireReadLock(TimeSpan timeout, out IReadLockAcquisition readLockAcquisition)
        {
            if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                readLockAcquisition = null;
                return false;
            }

            var disposables = (IDisposable)null;
            var ok = TryLockChildren(LockTypes.Read, timeout, out disposables);

            if (ok)
            {
                ok = InternalLock.TryEnterReadLock(timeout);

                if (ok)
                {
                    readLockAcquisition = new ReadLockAcquisition(owner: this, disposeWhenDone: LockChildren(LockTypes.Read));
                    return true;
                }
                else
                {
                    disposables?.Dispose();
                }
            }

            readLockAcquisition = null;
            return false;
        }