public async Task DifferentKeys_DontInterfere() { var @lock = new AsyncKeyedLock <int>(); await @lock.WriterLockAsync(0); await @lock.WriterLockAsync(1); }
public async Task WriteLocked_PreventsAnotherWriterLock() { var @lock = new AsyncKeyedLock <int>(); await @lock.WriterLockAsync(0); Task <IDisposable> task = @lock.WriterLockAsync(0); await AsyncHelper.NeverCompletesAsync(task); }
public async Task LockReleased_WriteTakesPriorityOverRead() { var @lock = new AsyncKeyedLock <int>(); Task writeLock, readLock; using (await @lock.WriterLockAsync(0)) { readLock = @lock.ReaderLockAsync(0); writeLock = @lock.WriterLockAsync(0); } await writeLock; await AsyncHelper.NeverCompletesAsync(readLock); }
public async Task ReadLocked_PreventsWriterLock() { var @lock = new AsyncKeyedLock <int>(); await @lock.ReaderLockAsync(0); var task = @lock.WriterLockAsync(0); await AsyncHelper.NeverCompletesAsync(task); }
public async Task WriteLocked_Unlocked_PermitsAnotherWriterLock() { var @lock = new AsyncKeyedLock <int>(); var firstWriteLockTaken = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); var releaseFirstWriteLock = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); var task = Task.Run(async() => { using (await @lock.WriterLockAsync(0)) { firstWriteLockTaken.SetResult(null); await releaseFirstWriteLock.Task; } }); await firstWriteLockTaken.Task; Task <IDisposable> lockTask = @lock.WriterLockAsync(0); Assert.False(lockTask.IsCompleted); releaseFirstWriteLock.SetResult(null); await lockTask; }
public async Task ReaderLocked_ReaderReleased_ReaderAndWriterWaiting_DoesNotReleaseReaderOrWriter() { var @lock = new AsyncKeyedLock <int>(); Task readLock, writeLock; await @lock.ReaderLockAsync(0); using (await @lock.ReaderLockAsync(0)) { writeLock = @lock.WriterLockAsync(0); readLock = @lock.ReaderLockAsync(0); } await Task.WhenAll(AsyncHelper.NeverCompletesAsync(writeLock), AsyncHelper.NeverCompletesAsync(readLock)); }
public async Task Unlocked_PermitsWriterLock() { var @lock = new AsyncKeyedLock <int>(); await @lock.WriterLockAsync(0); }
public async Task WriteLocked_NoWaiters() { var @lock = new AsyncKeyedLock <int>(); using (await @lock.WriterLockAsync(0)) { } }