public static async Task ExclusiveLock() { using (var syncRoot = new AsyncExclusiveLock()) using (var @lock = AsyncLock.Exclusive(syncRoot)) { var holder = await @lock.TryAcquire(CancellationToken.None); if (holder) { } else { throw new Exception(); } True(syncRoot.IsLockHeld); holder.Dispose(); False(syncRoot.IsLockHeld); holder = await @lock.Acquire(CancellationToken.None); True(syncRoot.IsLockHeld); holder.Dispose(); False(syncRoot.IsLockHeld); } }
private static AsyncLock GetExclusiveLock <T>(this T obj) where T : class { AsyncLock @lock; switch (obj) { case null: throw new ArgumentNullException(nameof(obj)); case AsyncExclusiveLock exclusive: @lock = AsyncLock.Exclusive(exclusive); break; case SemaphoreSlim semaphore: @lock = AsyncLock.Semaphore(semaphore); break; case AsyncReaderWriterLock rwl: @lock = AsyncLock.WriteLock(rwl); break; case ReaderWriterLockSlim _: case WaitHandle _: case ReaderWriterLock _: throw new ArgumentException(ExceptionMessages.UnsupportedLockAcquisition, nameof(obj)); default: @lock = AsyncLock.Exclusive(obj.GetUserData() .GetOrSet(ExclusiveLock, () => new AsyncExclusiveLock())); break; } return(@lock); }
public static void DisposedState() { var l = AsyncLock.Exclusive(); l.Dispose(); var result = l.TryAcquireAsync(CancellationToken.None).SuppressDisposedState(); True(result.IsCompletedSuccessfully); False(result.Result); }
private static AsyncLock GetExclusiveLock <T>(this T obj) where T : class { AsyncLock @lock; switch (obj) { case null: throw new ArgumentNullException(nameof(obj)); case AsyncSharedLock shared: @lock = AsyncLock.Exclusive(shared); break; case AsyncExclusiveLock exclusive: @lock = AsyncLock.Exclusive(exclusive); break; case SemaphoreSlim semaphore: @lock = AsyncLock.Semaphore(semaphore); break; case AsyncReaderWriterLock rwl: @lock = AsyncLock.WriteLock(rwl); break; case ReaderWriterLockSlim _: case WaitHandle _: case ReaderWriterLock _: case string str when !(string.IsInterned(str) is null): throw new InvalidOperationException(ExceptionMessages.UnsupportedLockAcquisition); default: @lock = AsyncLock.Exclusive(obj.GetUserData().GetOrSet(ExclusiveLock)); break; } return(@lock); }