public async Task WaitForWriteAsync_TheSecondReaderWouldBlocked()
        {
            var locker = new AsyncReaderWriterLock();

            using (await locker.WaitForWriteAsync())
            {
                Assert.IsFalse(locker.TryEnterRead(out _));
                using var tokenSrc = new CancellationTokenSource(1000);
                Assert.CatchAsync <OperationCanceledException>(() => locker.WaitForReadAsync(tokenSrc.Token));
            }
        }
        public async Task Reader_Writer_Reader_LastReaderBlock()
        {
            var locker  = new AsyncReaderWriterLock();
            var reader1 = await locker.WaitForReadAsync();

            var writer = locker.WaitForWriteAsync();
            await Task.Delay(100);

            Assert.IsFalse(locker.TryEnterRead(out _));
            using var tokenSrc = new CancellationTokenSource(1000);
            Assert.CatchAsync <OperationCanceledException>(() => locker.WaitForReadAsync(tokenSrc.Token));
        }
        public async Task AfterWriterExit_AllReadersWereActivated()
        {
            var locker = new AsyncReaderWriterLock();
            var writer = await locker.WaitForWriteAsync();

            var readers = Task.WhenAll(
                locker.WaitForReadAsync(),
                locker.WaitForReadAsync());
            await Task.Delay(1000);

            Assert.IsFalse(readers.IsCompleted);

            writer.Dispose();

            Assert.IsTrue(locker.TryEnterRead(out _));
            await readers;
        }