コード例 #1
0
        public async Task DifferentKeys_DontInterfere()
        {
            var @lock = new AsyncKeyedLock <int>();
            await @lock.WriterLockAsync(0);

            await @lock.WriterLockAsync(1);
        }
コード例 #2
0
        public async Task WriteLocked_PreventsAnotherWriterLock()
        {
            var @lock = new AsyncKeyedLock <int>();
            await @lock.WriterLockAsync(0);

            Task <IDisposable> task = @lock.WriterLockAsync(0);
            await AsyncHelper.NeverCompletesAsync(task);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        public async Task ReadLocked_PreventsWriterLock()
        {
            var @lock = new AsyncKeyedLock <int>();
            await @lock.ReaderLockAsync(0);

            var task = @lock.WriterLockAsync(0);
            await AsyncHelper.NeverCompletesAsync(task);
        }
コード例 #5
0
        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;
        }
コード例 #6
0
        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));
        }
コード例 #7
0
 public async Task Unlocked_PermitsWriterLock()
 {
     var @lock = new AsyncKeyedLock <int>();
     await @lock.WriterLockAsync(0);
 }
コード例 #8
0
        public async Task WriteLocked_NoWaiters()
        {
            var @lock = new AsyncKeyedLock <int>();

            using (await @lock.WriterLockAsync(0)) { }
        }