public async Task PriorityProducerConsumer_Pending_Priority3()
        {
            var ppc          = new PriorityProducerConsumer <int>(2);
            var values       = new int[3];
            var tcsConsumer  = new TaskCompletionSource <bool>();
            var tcsProducer  = new TaskCompletionSource <bool>();
            var consumerTask = Task.Run(async() => {
                for (var i = 0; i < 3; i++)
                {
                    var task = ppc.ConsumeAsync();
                    tcsConsumer.TrySetResult(true);
                    values[i] = await task;
                    await tcsProducer.Task;
                }
            });

            Assert.AreEqual(TaskStatus.WaitingForActivation, consumerTask.Status);

            await tcsConsumer.Task;

            ppc.Produce(5, 1);
            ppc.Produce(6, 1);
            ppc.Produce(7);
            tcsProducer.SetResult(false);

            await consumerTask;

            Assert.AreEqual(TaskStatus.RanToCompletion, consumerTask.Status);
            Assert.AreEqual(5, values[0]);
            Assert.AreEqual(7, values[1]);
            Assert.AreEqual(6, values[2]);
        }
 public void PriorityProducerConsumer_NoPending_Priority2()
 {
     using (var ppc = new PriorityProducerConsumer <int>(2)) {
         ppc.Produce(6, 1);
         ppc.Produce(5);
         var consumerTask = ppc.ConsumeAsync();
         Assert.AreEqual(TaskStatus.RanToCompletion, consumerTask.Status);
         Assert.AreEqual(5, consumerTask.Result);
     }
 }
        public async Task PriorityProducerConsumer_Pending_Priority1()
        {
            var ppc          = new PriorityProducerConsumer <int>(2);
            var consumerTask = ppc.ConsumeAsync();

            Assert.AreEqual(TaskStatus.WaitingForActivation, consumerTask.Status);

            ppc.Produce(5);
            ppc.Produce(6, 1);
            await consumerTask;

            Assert.AreEqual(TaskStatus.RanToCompletion, consumerTask.Status);
            Assert.AreEqual(5, consumerTask.Result);
        }
Пример #4
0
            private Task <IDisposable> Enqueue(int priority, bool isAwaitable, CancellationToken cancellationToken = default(CancellationToken))
            {
                var item = new QueueItem(isAwaitable, cancellationToken);

                _ppc.Produce(item, priority);
                return(item.Task);
            }
Пример #5
0
        public void PriorityProducerConsumer_NoPending_Duplicates3()
        {
            using var ppc = new PriorityProducerConsumer <int>(3, true);
            ppc.Produce(5, 1);
            ppc.Produce(6, 1);
            ppc.Produce(5, 1);
            var consumerTask1 = ppc.ConsumeAsync();
            var consumerTask2 = ppc.ConsumeAsync();
            var consumerTask3 = ppc.ConsumeAsync();

            Assert.AreEqual(TaskStatus.RanToCompletion, consumerTask1.Status);
            Assert.AreEqual(TaskStatus.RanToCompletion, consumerTask2.Status);
            Assert.AreEqual(TaskStatus.WaitingForActivation, consumerTask3.Status);
            Assert.AreEqual(6, consumerTask1.Result);
            Assert.AreEqual(5, consumerTask2.Result);
        }
Пример #6
0
        public async Task PriorityProducerConsumer_ExcludeDuplicates_HigherPriority()
        {
            using var ppc = new PriorityProducerConsumer <int>(maxPriority: 2, excludeDuplicates: true);

            ppc.Produce(value: 1, priority: 1);
            ppc.Produce(value: 2, priority: 1);
            ppc.Produce(value: 3, priority: 1);
            ppc.Produce(value: 1, priority: 0);
            ppc.Produce(value: 2, priority: 0);

            var data1 = await ppc.ConsumeAsync(CancellationToken.None);

            data1.Should().Be(1);

            var data2 = await ppc.ConsumeAsync(CancellationToken.None);

            data2.Should().Be(2);

            var data3 = await ppc.ConsumeAsync(CancellationToken.None);

            data3.Should().Be(3);
        }
Пример #7
0
        public void PriorityProducerConsumer_MaxPriority()
        {
            using var ppc = new PriorityProducerConsumer <int>(maxPriority: 2, excludeDuplicates: false);

            Assert.ThrowsException <ArgumentOutOfRangeException>(() => ppc.Produce(value: 1, priority: 2));
        }