void IDeadlockMonitorAdapter.ExitWriteLock(ReaderWriterLockSlim obj)
        {
            // Помечаем данный поток как не имеющий блокировку объекта obj с уровнем WriteLock
            DeadlockDetectionEngine.ReleaseOwner(obj, LockAccessLevel.Write);

            obj.ExitWriteLock();
        }
        private static bool TryEnterLock <T>(
            T lockObject,
            LockAccessLevel level,
            Func <T, bool> wait)
        {
            DeadlockDetectionEngine.RegisterWaiting(lockObject, level);
            if (!wait(lockObject))
            {
                DeadlockDetectionEngine.RemoveWaiting(lockObject, level);
                return(false);
            }

            // Помечаем данный поток как имеющий блокировку объекта obj с уровнем level
            DeadlockDetectionEngine.RegisterOwner(lockObject, level);

            return(true);
        }
        private static void EnterLock <T>(
            T lockObject,
            LockAccessLevel level,
            Func <T, bool> optimisticWait,
            Action <T> wait)
        {
            // Сначала дожидаемся в пределах оптимистичного таймаута
            DeadlockDetectionEngine.RegisterWaiting(lockObject, level);
            if (!optimisticWait(lockObject))
            {
                // Если блокировка не былаа захвачена в течении оптимистичного таймаута,
                // то проверяем, нет ли дедлока
                DeadlockDetectionEngine.VerifyDeadlock(lockObject, level);

                // Дожидаемся захвата блокировки
                wait(lockObject);
            }

            // Помечаем данный поток как имеющий блокировку объекта obj с уровнем level
            DeadlockDetectionEngine.RegisterOwner(lockObject, level);
        }
 string IDeadlockMonitorAdapter.GetDiagnostics(bool enableStackTrace)
 => DeadlockDetectionEngine.GetDiagnostics(enableStackTrace);