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; }