private static async void AcquireWeakLockAndRelease(AsyncSharedLock sharedLock, AsyncCountdownEvent acquireEvent) { await Task.Delay(100); await sharedLock.AcquireAsync(false, TimeSpan.Zero); acquireEvent.Signal(); await Task.Delay(100); sharedLock.Release(); }
public static async Task StrongToWeakLockTransition() { using var acquireEvent = new AsyncCountdownEvent(2L); using var sharedLock = new AsyncSharedLock(3); await sharedLock.AcquireAsync(true, TimeSpan.Zero); AcquireWeakLock(sharedLock, acquireEvent); AcquireWeakLock(sharedLock, acquireEvent); sharedLock.Release(); True(await acquireEvent.WaitAsync(DefaultTimeout)); Equal(1, sharedLock.RemainingCount); }
public static async Task WeakToStrongLockTransition() { using var acquireEvent = new AsyncCountdownEvent(3L); using var sharedLock = new AsyncSharedLock(3); AcquireWeakLockAndRelease(sharedLock, acquireEvent); AcquireWeakLockAndRelease(sharedLock, acquireEvent); AcquireWeakLockAndRelease(sharedLock, acquireEvent); True(await acquireEvent.WaitAsync(DefaultTimeout)); await sharedLock.AcquireAsync(true, DefaultTimeout); Equal(0, sharedLock.RemainingCount); }
public static void GracefulShutdown5() { using var @lock = new AsyncSharedLock(3); True(@lock.TryAcquire(true)); var acquisition1 = @lock.AcquireAsync(false, CancellationToken.None); False(acquisition1.IsCompleted); var task = @lock.DisposeAsync(); False(task.IsCompleted); var acquisition2 = @lock.AcquireAsync(false, CancellationToken.None); False(task.IsCompleted); @lock.Downgrade(); True(acquisition1.IsCompletedSuccessfully); False(acquisition2.IsCompleted); False(task.IsCompleted); @lock.Downgrade(); True(acquisition2.IsFaulted); True(task.IsCompletedSuccessfully); Throws <ObjectDisposedException>(acquisition2.GetAwaiter().GetResult); }
private static async void AcquireWeakLock(AsyncSharedLock sharedLock, AsyncCountdownEvent acquireEvent) { await sharedLock.AcquireAsync(false, DefaultTimeout, CancellationToken.None); acquireEvent.Signal(); }