コード例 #1
0
        IMailboxQueue GetMailboxQueue(MailboxQueueKind kind)
        {
            switch (kind)
            {
            case MailboxQueueKind.Bounded: return(new BoundedMailboxQueue(4));

            case MailboxQueueKind.Unbounded: return(new UnboundedMailboxQueue());
            }
            throw new ArgumentOutOfRangeException(nameof(kind));
        }
コード例 #2
0
        private IMailboxQueue GetMailboxQueue(MailboxQueueKind kind)
        {
            switch (kind)
            {
            case MailboxQueueKind.Bounded: return(new BoundedMailboxQueue(4));

            case MailboxQueueKind.Unbounded: return(new UnboundedMailboxQueue());

            default:
                throw new ArgumentOutOfRangeException(nameof(kind), kind, null);
            }
        }
コード例 #3
0
        public void Given_MailboxQueue_when_enqueue_and_dequeue_in_different_threads_Then_we_get_the_elements_in_the_FIFO_order(MailboxQueueKind kind)
        {
            const int msgCount     = 1000;
            var       cancelSource = new CancellationTokenSource();

            var sut = GetMailboxQueue(kind);

            var producer = new Thread(_ =>
            {
                for (int i = 0; i < msgCount; i++)
                {
                    if (cancelSource.IsCancellationRequested)
                    {
                        return;
                    }
                    sut.Push(i);
                }
            });

            var consumerList = new List <int>();
            var consumer     = new Thread(l =>
            {
                var list = (List <int>)l;
                for (var i = 0; i < msgCount; i++)
                {
                    var popped = sut.Pop();
                    while (popped == null)
                    {
                        if (cancelSource.IsCancellationRequested)
                        {
                            return;
                        }

                        Thread.Sleep(1);
                        popped = sut.Pop();
                    }
                    list.Add((int)popped);
                }
            });

            producer.Start(); consumer.Start(consumerList);
            producer.Join(1000); consumer.Join(1000);
            cancelSource.Cancel();

            Assert.Equal(msgCount, consumerList.Count);
            for (var i = 0; i < msgCount; i++)
            {
                Assert.Equal(i, consumerList[i]);
            }
        }
コード例 #4
0
        public void Given_MailboxQueue_When_push_pop_Then_HasMessages_relate_the_queue_status(MailboxQueueKind kind)
        {
            var sut = GetMailboxQueue(kind);

            Assert.False(sut.HasMessages);

            sut.Push(1);
            Assert.True(sut.HasMessages);

            sut.Push(2);
            Assert.True(sut.HasMessages);

            Assert.Equal(1, sut.Pop());
            Assert.True(sut.HasMessages);

            Assert.Equal(2, sut.Pop());
            Assert.False(sut.HasMessages);
        }
コード例 #5
0
 private IMailboxQueue GetMailboxQueue(MailboxQueueKind kind)
 => kind switch
 {