/// <summary> Sets the state of the lock. </summary>
        /// <param name="lockObj"> The lock object. </param>
        /// <param name="newState"> The new state. </param>
        /// <param name="oldState"> The old state. </param>
        /// <param name="timeout"> The timeout. </param>
        /// <returns> RWLock.State. </returns>
        public static RWLock.State SetLockState(this ReaderWriterLock lockObj, RWLock.State newState, RWLock.State?oldState = null,
                                                int?timeout = null)
        {
            oldState = oldState ?? lockObj.GetLockState();
            if (oldState.Value != newState)
            {
                switch (oldState.Value)
                {
                case RWLock.State.NoLock:
                    if (newState == RWLock.State.ReadLock)
                    {
                        lockObj.AcquireReaderLock(timeout ?? 90000);
                    }
                    else
                    {
                        lockObj.AcquireWriterLock(timeout ?? 90000);
                    }
                    break;

                case RWLock.State.WriteLock:
                    if (newState == RWLock.State.NoLock)
                    {
                        lockObj.ReleaseWriterLock();
                    }
                    else
                    {
                        lockObj.DowngradeFromWriterLock(ref _lockCookie);
                    }
                    break;

                default:
                    if (newState == RWLock.State.NoLock)
                    {
                        lockObj.ReleaseReaderLock();
                    }
                    else
                    {
                        _lockCookie = lockObj.UpgradeToWriterLock(timeout ?? 90000);
                    }
                    break;
                }
            }
            return(oldState.Value);
        }