/// <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()); }