コード例 #1
0
        public void WaitAsync_Cancelled_DoesNotTakeSlot()
        {
            AsyncContext.Run(async () =>
            {
                var semaphore = new AsyncSemaphore(0);
                Assert.AreEqual(0, semaphore.CurrentCount);
                var cts = new CancellationTokenSource();
                var task = semaphore.WaitAsync(cts.Token);
                Assert.AreEqual(0, semaphore.CurrentCount);
                Assert.IsFalse(task.IsCompleted);

                cts.Cancel();

                try
                {
                    await task;
                }
                catch (OperationCanceledException)
                {
                }
                semaphore.Release();
                Assert.AreEqual(1, semaphore.CurrentCount);
                Assert.IsTrue(task.IsCanceled);
            });
        }
コード例 #2
0
 public void WaitAsync_NoSlotsAvailable_IsNotCompleted()
 {
     Test.Async(async () =>
     {
         var semaphore = new AsyncSemaphore(0);
         Assert.AreEqual(0, semaphore.CurrentCount);
         var task = semaphore.WaitAsync();
         Assert.AreEqual(0, semaphore.CurrentCount);
         await AssertEx.NeverCompletesAsync(task);
     });
 }
コード例 #3
0
        public void WaitAsync_PreCancelled_NoSlotAvailable_CancelsSynchronously()
        {
            var semaphore = new AsyncSemaphore(0);
            Assert.AreEqual(0, semaphore.CurrentCount);
            var token = new CancellationToken(true);

            var task = semaphore.WaitAsync(token);

            Assert.AreEqual(0, semaphore.CurrentCount);
            Assert.IsTrue(task.IsCompleted);
            Assert.IsTrue(task.IsCanceled);
            Assert.IsFalse(task.IsFaulted);
        }
コード例 #4
0
 public void WaitAsync_SlotAvailable_IsCompleted()
 {
     Test.Async(async () =>
     {
         var semaphore = new AsyncSemaphore(1);
         Assert.AreEqual(1, semaphore.CurrentCount);
         var task1 = semaphore.WaitAsync();
         Assert.AreEqual(0, semaphore.CurrentCount);
         Assert.IsTrue(task1.IsCompleted);
         var task2 = semaphore.WaitAsync();
         Assert.AreEqual(0, semaphore.CurrentCount);
         await AssertEx.NeverCompletesAsync(task2);
     });
 }
コード例 #5
0
ファイル: AsyncSemaphore.cs プロジェクト: Lakerfield/AsyncEx
 public DebugView(AsyncSemaphore semaphore)
 {
     _semaphore = semaphore;
 }
コード例 #6
0
 public DebugView(AsyncSemaphore semaphore)
 {
     _semaphore = semaphore;
 }
コード例 #7
0
 public void Id_IsNotZero()
 {
     var semaphore = new AsyncSemaphore(0);
     Assert.AreNotEqual(0, semaphore.Id);
 }
コード例 #8
0
 public void Release_ZeroSlots_HasNoEffect()
 {
     var semaphore = new AsyncSemaphore(1);
     Assert.AreEqual(1, semaphore.CurrentCount);
     semaphore.Release(0);
     Assert.AreEqual(1, semaphore.CurrentCount);
 }
コード例 #9
0
 public void Release_Overflow_ThrowsException()
 {
     var semaphore = new AsyncSemaphore(int.MaxValue);
     Assert.AreEqual(int.MaxValue, semaphore.CurrentCount);
     AssertEx.ThrowsException<InvalidOperationException>(() => semaphore.Release());
 }
コード例 #10
0
 public void Release_WithWaiters_ReleasesWaiters()
 {
     Test.Async(async () =>
     {
         var semaphore = new AsyncSemaphore(0);
         Assert.AreEqual(0, semaphore.CurrentCount);
         var task = semaphore.WaitAsync();
         Assert.AreEqual(0, semaphore.CurrentCount);
         Assert.IsFalse(task.IsCompleted);
         semaphore.Release();
         Assert.AreEqual(0, semaphore.CurrentCount);
         await task;
     });
 }
コード例 #11
0
 public void Release_WithoutWaiters_IncrementsCount()
 {
     var semaphore = new AsyncSemaphore(0);
     Assert.AreEqual(0, semaphore.CurrentCount);
     semaphore.Release();
     Assert.AreEqual(1, semaphore.CurrentCount);
     var task = semaphore.WaitAsync();
     Assert.AreEqual(0, semaphore.CurrentCount);
     Assert.IsTrue(task.IsCompleted);
 }