/// <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); } }