public async Task PublishSubscribe_ShouldLimitSimultaneouslyRunningHandlersToSpecifiedValue_IfMaxConcurrentHandlersSpecified() { // given var delivery = new CountdownEvent(10); _sut = CreateCaraBus(new CaraBusBaseOptions { MaxDegreeOfParallelism = 5 }); _sut.Subscribe <TestMessage>(m => { Thread.Sleep(TimeSpan.FromMilliseconds(800)); delivery.Signal(); }, SubscribeOptions.NonExclusive()); await _sut.StartAsync(); // when var sw = new Stopwatch(); sw.Start(); for (var i = 0; i < 10; i++) { await _sut.PublishAsync(new TestMessage()); } delivery.Wait(TimeSpan.FromSeconds(15)); sw.Stop(); var executioTime = sw.Elapsed; // then Assert.That(executioTime.Seconds, Is.GreaterThanOrEqualTo(1)); Assert.That(executioTime.Seconds, Is.LessThanOrEqualTo(2)); // 10 messages, 5 max parallel degree, 10/5 = 2 messages per moment, 800ms * 2 = ~1600 }