public async Task ShouldPump()
        {
            AsyncPump pump = new AsyncPump(1);

            Stopwatch stopwatch = Stopwatch.StartNew();

            pump.Enqueue(new DelayQueueitem(TimeSpan.FromSeconds(15)));
            pump.Enqueue(new DelayQueueitem(TimeSpan.FromSeconds(15)));
            pump.Enqueue(new DelayQueueitem(TimeSpan.FromSeconds(15)));

            pump.Start();

            await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
            await pump.StopAsync(TimeSpan.FromSeconds(2)).ConfigureAwait(false);

            stopwatch.Stop();
            Console.WriteLine($"Took {stopwatch.Elapsed.TotalSeconds} seconds");

            Assert.That(stopwatch.Elapsed.TotalSeconds, Is.EqualTo(4).Within(0.2));
        }
        public async Task ShouldExecuteAllItems()
        {
            AsyncPump pump = new AsyncPump(1);

            Stopwatch stopwatch = Stopwatch.StartNew();
            List<object> resultList = new List<object>();
            Func<Task> func =
                () => Task.Run(
                    () => resultList.Add(new object()));

            pump.Enqueue(new FuncQueueItem(func));
            pump.Enqueue(new FuncQueueItem(func));
            pump.Enqueue(new FuncQueueItem(func));

            pump.Start();

            await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
            await pump.StopAsync(TimeSpan.FromSeconds(2)).ConfigureAwait(false);

            stopwatch.Stop();
            Console.WriteLine($"Took {stopwatch.Elapsed.TotalSeconds} seconds");

            Assert.That(resultList.Count, Is.EqualTo(3));
        }