예제 #1
0
        private static async void AcquireWeakLockAndRelease(AsyncSharedLock sharedLock, AsyncCountdownEvent acquireEvent)
        {
            await Task.Delay(100);

            await sharedLock.Acquire(false, TimeSpan.Zero);

            acquireEvent.Signal();
            await Task.Delay(100);

            sharedLock.Release();
        }
예제 #2
0
        public static async Task StrongToWeakLockTransition()
        {
            using (var acquireEvent = new AsyncCountdownEvent(2L))
                using (var sharedLock = new AsyncSharedLock(3))
                {
                    await sharedLock.Acquire(true, TimeSpan.Zero);

                    AcquireWeakLock(sharedLock, acquireEvent);
                    AcquireWeakLock(sharedLock, acquireEvent);
                    sharedLock.Release();
                    True(await acquireEvent.Wait(TimeSpan.FromMinutes(1)));
                    Equal(1, sharedLock.RemainingCount);
                }
        }
예제 #3
0
        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);
                    await acquireEvent.Wait();

                    await sharedLock.Acquire(true, TimeSpan.FromMinutes(1));

                    Equal(0, sharedLock.RemainingCount);
                }
        }
예제 #4
0
        private static async void AcquireWeakLock(AsyncSharedLock sharedLock, AsyncCountdownEvent acquireEvent)
        {
            await sharedLock.Acquire(false, CancellationToken.None);

            acquireEvent.Signal();
        }