/// <summary>
        /// 进入写锁
        /// </summary>
        /// <param name="cancellation"></param>
        /// <returns></returns>
        public async Task <IDisposable> WaitForWriteAsync(CancellationToken cancellation = default)
        {
            LinkedListNode <LockWaiterEvent> node;

            lock (m_lock)
            {
                node = m_currentState.WaitForWrite();
            }

            var waiter   = node.Value;
            var disposer = new OnceDisposer <LinkedListNode <LockWaiterEvent> >(InternalExitWriteLock, node);

#if NETSTANDARD2_1
            await
#endif
            using (cancellation.Register(() => waiter.TrySetResult(LockStatus.Cancelled)))
            {
                if (cancellation.IsCancellationRequested)
                {
                    waiter.TrySetResult(LockStatus.Cancelled);
                }

                var status = await waiter.Task;

                if (status != LockStatus.Cancelled)
                {
                    return(disposer);
                }

                disposer.Dispose();
                throw new OperationCanceledException(cancellation);
            }
        }
        /// <summary>
        /// 尝试进入写锁
        /// </summary>
        public bool TryEnterWrite(out IDisposable disposer)
        {
            disposer = null;
            lock (m_lock)
            {
                if (!m_currentState.TryEnterWrite(out var node))
                {
                    return(false);
                }

                disposer = new OnceDisposer <LinkedListNode <LockWaiterEvent> >(InternalExitWriteLock, node);
                return(true);
            }
        }