예제 #1
0
        /// <summary>
        /// Begins consuming messages from the queue.  The number of messages consumed is limited by the maxActiveMessages value.  Once the
        /// client has consumed the max number of messages, no new messages will be received until a message has been acknolwedged.
        /// </summary>
        /// <param name="maxActiveMessages">The maximum number of messages that can be processed at one time.</param>
        public void BeginLimitedConsume(int maxActiveMessages, bool autoAcknowledge)
        {
            if (maxActiveMessages <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(maxActiveMessages), "Value must be more than 0.");
            }

            if (limitedConsumeSempahore != null)
            {
                throw new Exception();
            }

            if (fullConsumeActive || limitedConsumeActive)
            {
                throw new InvalidOperationException();
            }

            limitedConsumeActive    = true;
            autoAcknowledgeMessages = autoAcknowledge;

            limitedConsumeSempahore         = new SimpleCountingSemaphore(maxActiveMessages);
            cancellationTokenSource         = new CancellationTokenSource();
            limitedConsumeCancellationToken = cancellationTokenSource.Token;

            limitedConsumeTask = new Task(RunLimitedConsumeTask, limitedConsumeCancellationToken);

            limitedConsumeTask.Start();
        }
        public void InvalidConstructorInputsTest()
        {
            // startCount < 0
            CatchExceptionHelper.VerifyExceptionCaught <ArgumentException>(() => new SimpleCountingSemaphore(100, -1));

            // startCount < maxCoutn
            CatchExceptionHelper.VerifyExceptionCaught <ArgumentException>(() => new SimpleCountingSemaphore(100, 1000));

            // Valid inputs
            var sem = new SimpleCountingSemaphore(10, 0);

            Assert.AreEqual(sem.Count, 0);
            Assert.AreEqual(sem.MaxCount, 10);
        }
        public void GiveTakeTest()
        {
            var sem = new SimpleCountingSemaphore(3, 0);

            sem.Take();
            Assert.AreEqual(sem.Count, 1);
            sem.Take();
            Assert.AreEqual(sem.Count, 2);
            sem.Take();
            Assert.AreEqual(sem.Count, 3);

            var result = sem.TryTake();

            Assert.IsFalse(result);
            Assert.AreEqual(sem.Count, 3);

            Timer timer = new Timer(200);

            timer.Elapsed += (sender, e) => sem.Give();
            timer.Start();

            sem.Take();
            Assert.AreEqual(sem.Count, 3);

            sem.Give();
            Assert.AreEqual(sem.Count, 2);
            sem.Give();
            Assert.AreEqual(sem.Count, 1);
            sem.Give();
            Assert.AreEqual(sem.Count, 0);
            sem.Give();
            Assert.AreEqual(sem.Count, 0);

            sem.Dispose();
            CatchExceptionHelper.VerifyExceptionCaught <ObjectDisposedException>(() => sem.Take());
        }