예제 #1
0
        public async Task AddCompleteTakeTake()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();
            //****************************************

            await MyCollection.AddComplete(42);

            var Result = await MyCollection.Take();

            try
            {
                _ = await MyCollection.Take();

                Assert.Fail("Should not reach here");
            }
            catch (InvalidOperationException)
            {
            }

            //****************************************

            Assert.AreEqual(0, MyCollection.Count, "Count not as expected");
            Assert.AreEqual(42, Result, "Result not as expected");

            Assert.IsTrue(MyCollection.IsCompleted, "Not completed");
        }
예제 #2
0
        public async Task TakeThenComplete()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();
            //****************************************

            var MyTask = MyCollection.Take();

            Assert.IsFalse(MyTask.IsCompleted, "Took too early");

            _ = MyCollection.CompleteAdding();

            //****************************************

            try
            {
                _ = await MyTask;

                Assert.Fail("Should not reach here");
            }
            catch (InvalidOperationException)
            {
            }

            Assert.IsTrue(MyCollection.IsAddingCompleted, "Adding not completed");
            Assert.IsTrue(MyCollection.IsCompleted, "Collection not completed");
        }
예제 #3
0
        public async Task AddCancel()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>(1);
            //****************************************

            await MyCollection.Add(42);

            using (var MySource = new CancellationTokenSource())
            {
                var MyTask = MyCollection.Add(84, MySource.Token);

                Assert.IsFalse(MyTask.IsCompleted, "Added too early");

                MySource.Cancel();

                try
                {
                    await MyTask;

                    Assert.Fail("Wait not cancelled");
                }
                catch (OperationCanceledException)
                {
                }
            }

            var Result = await MyCollection.Take();

            //****************************************

            Assert.AreEqual(0, MyCollection.WaitingToAdd, "Tasks unexpectedly waiting");
            Assert.AreEqual(42, Result, "Result not as expected");
        }
예제 #4
0
        public async Task TakeCancel()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();

            //****************************************

            using (var MySource = new CancellationTokenSource())
            {
                var MyTask = MyCollection.Take(MySource.Token);

                Assert.IsFalse(MyTask.IsCompleted, "Took too early");

                MySource.Cancel();

                try
                {
                    _ = await MyTask;

                    Assert.Fail("Wait not cancelled");
                }
                catch (OperationCanceledException)
                {
                }
            }

            await MyCollection.Add(42);

            //****************************************

            Assert.AreEqual(0, MyCollection.WaitingToTake, "Tasks unexpectedly waiting");
        }
예제 #5
0
 public ArraySegment <byte> Take(int size, CancellationToken cancellationToken = new CancellationToken())
 {
     if (cancellationToken.IsCancellationRequested)
     {
         throw new TaskCanceledException();
     }
     if (lastChunk == null)
     {
         lastChunk = buffer.Take(cancellationToken);
     }
     return(ConsumeChunk(size));
 }
        public void TakeWithDelay()
        {
            AsyncCollection <int> collection = new AsyncCollection <int>();

            Task.Run(() =>
            {
                Thread.Sleep(100);
                collection.Add(1);
            });

            int item = collection.Take();

            Assert.AreEqual(item, 1);
        }
예제 #7
0
        public async Task AddMaximumAddCompleteTakeTake()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>(1);
            //****************************************

            await MyCollection.Add(42);

            var MyTask = MyCollection.AddComplete(84);

            _ = await MyCollection.Take();

            await MyTask;

            var MyResult = await MyCollection.Take();

            //****************************************

            Assert.AreEqual(84, MyResult, "Result was not as expected");

            Assert.AreEqual(0, MyCollection.Count, "Count not as expected");
            Assert.AreEqual(0, MyCollection.WaitingToAdd, "Waiting adders not as expected");

            Assert.IsTrue(MyCollection.IsCompleted, "Collection is not completed");
        }
예제 #8
0
        public async Task TakeMultiCancel()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();

            //****************************************

            using var MySource = new CancellationTokenSource();

            var MyTask1 = MyCollection.Take(MySource.Token);
            var MyTask2 = MyCollection.Take();

            Assert.IsFalse(MyTask1.IsCompleted, "Took too early");
            Assert.IsFalse(MyTask2.IsCompleted, "Took too early");

            MySource.Cancel();

            try
            {
                _ = await MyTask1;

                Assert.Fail("Wait not cancelled");
            }
            catch (OperationCanceledException)
            {
            }

            await MyCollection.Add(42);

            var Result = await MyTask2;

            //****************************************

            Assert.AreEqual(0, MyCollection.Count, "Item not removed");
            Assert.AreEqual(0, MyCollection.WaitingToTake, "Tasks unexpectedly waiting");
            Assert.AreEqual(42, Result, "Result not as expected");
        }
예제 #9
0
        public async Task AddCompleteTake()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();
            //****************************************

            await MyCollection.AddComplete(42);

            var MyTask = MyCollection.Take();

            //****************************************

            Assert.IsTrue(MyTask.IsCompleted, "Still waiting to take");

            Assert.AreEqual(0, MyCollection.Count, "Count not as expected");

            Assert.IsTrue(MyCollection.IsCompleted, "Not completed");
        }
예제 #10
0
        public async Task TakeAdd()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();
            //****************************************

            var MyTask = MyCollection.Take();

            Assert.IsFalse(MyTask.IsCompleted, "Took too early");

            await MyCollection.Add(42);

            var MyResult = await MyTask;

            //****************************************

            Assert.AreEqual(42, MyResult, "Result not as expected");

            Assert.AreEqual(0, MyCollection.Count, "Count not as expected");
        }
예제 #11
0
        public async Task TakeAddMaximum()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>(1);
            //****************************************

            var MyTask = MyCollection.Take();

            await MyCollection.Add(42);

            await MyCollection.Add(84);

            var MyResult = await MyTask;

            //****************************************

            Assert.AreEqual(42, MyResult, "Result was not as expected");

            Assert.AreEqual(1, MyCollection.Count, "Count not as expected");
            Assert.AreEqual(0, MyCollection.WaitingToAdd, "Waiting adders not as expected");
        }
예제 #12
0
        public async Task TakeAddThenComplete()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();
            //****************************************

            var MyTask = MyCollection.Take();

            await MyCollection.Add(42);

            _ = MyCollection.CompleteAdding();

            var MyResult = await MyTask;

            //****************************************

            Assert.AreEqual(0, MyCollection.Count, "Count not as expected");
            Assert.AreEqual(42, MyResult, "Result not as expected");

            Assert.IsTrue(MyCollection.IsAddingCompleted, "Adding not completed");
            Assert.IsTrue(MyCollection.IsCompleted, "Collection not completed");
        }
예제 #13
0
        public async Task TakeMaxTime()
        {               //****************************************
            var MyCollection = new AsyncCollection <int>();
            //****************************************

            var MyTask = MyCollection.Take(TimeSpan.FromMilliseconds(50));

            Thread.Sleep(100);

            //****************************************

            try
            {
                _ = await MyTask;

                Assert.Fail("Wait not cancelled");
            }
            catch (TimeoutException)
            {
            }
        }