예제 #1
0
 public static void DowgradeWeakLock()
 {
     using var sharedLock = new AsyncSharedLock(3);
     True(sharedLock.TryAcquire(false));
     Equal(2, sharedLock.RemainingCount);
     sharedLock.Downgrade();
     False(sharedLock.IsLockHeld);
     Throws <SynchronizationLockException>(sharedLock.Downgrade);
 }
예제 #2
0
 public static void DowngradeFromStrongToWeakLock()
 {
     using var sharedLock = new AsyncSharedLock(3);
     True(sharedLock.TryAcquire(true));
     Equal(0, sharedLock.RemainingCount);
     False(sharedLock.TryAcquire(false));
     sharedLock.Downgrade();
     Equal(2, sharedLock.RemainingCount);
     sharedLock.Release();
     Equal(3, sharedLock.RemainingCount);
 }
예제 #3
0
        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);
        }