예제 #1
0
        public static async Task InvalidExits()
        {
            using var rwLock = new AsyncReaderWriterLock();
            Throws <SynchronizationLockException>(rwLock.ExitReadLock);
            Throws <SynchronizationLockException>(rwLock.ExitUpgradeableReadLock);
            Throws <SynchronizationLockException>(rwLock.ExitWriteLock);

            await rwLock.EnterReadLockAsync(TimeSpan.FromMilliseconds(10));

            Throws <SynchronizationLockException>(rwLock.ExitUpgradeableReadLock);
            Throws <SynchronizationLockException>(rwLock.ExitWriteLock);
            rwLock.ExitReadLock();

            await rwLock.EnterUpgradeableReadLockAsync(TimeSpan.FromMilliseconds(10));

            Throws <SynchronizationLockException>(rwLock.ExitReadLock);
            Throws <SynchronizationLockException>(rwLock.ExitWriteLock);
            rwLock.ExitUpgradeableReadLock();

            await rwLock.EnterWriteLockAsync(TimeSpan.FromMilliseconds(10));

            Throws <SynchronizationLockException>(rwLock.ExitReadLock);
            Throws <SynchronizationLockException>(rwLock.ExitUpgradeableReadLock);
            rwLock.ExitWriteLock();
        }
        public static void GracefulShutdown3()
        {
            using var @lock = new AsyncReaderWriterLock();
            True(@lock.TryEnterWriteLock());
            var acquisition1 = @lock.EnterReadLockAsync(CancellationToken.None);

            False(acquisition1.IsCompleted);
            var task = @lock.DisposeAsync();

            False(task.IsCompleted);
            var acquisition2 = @lock.EnterReadLockAsync(CancellationToken.None);

            False(task.IsCompleted);

            @lock.ExitWriteLock();
            True(acquisition1.IsCompletedSuccessfully);
            False(acquisition2.IsCompleted);
            False(task.IsCompleted);

            @lock.ExitReadLock();
            True(acquisition2.IsFaulted);
            True(task.IsCompletedSuccessfully);
            Throws <ObjectDisposedException>(acquisition2.GetAwaiter().GetResult);
        }
예제 #3
0
        public static async Task WriterToReaderChain()
        {
            using var are    = new AutoResetEvent(false);
            using var rwLock = new AsyncReaderWriterLock();
            await rwLock.EnterWriteLockAsync(DefaultTimeout);

            var task = new TaskCompletionSource <bool>();

            ThreadPool.QueueUserWorkItem(async state =>
            {
                False(await rwLock.TryEnterReadLockAsync(TimeSpan.FromMilliseconds(10)));
                True(ThreadPool.QueueUserWorkItem(static ev => ev.Set(), are, false));
                await rwLock.EnterReadLockAsync(DefaultTimeout);
                rwLock.ExitReadLock();
                task.SetResult(true);
            });