public static async Task TestWithoutMinimumAsync()
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();

            var tasks = new List <Task>();

            for (var i = 0; i < 100; i++)
            {
                var instance = new ThreadpoolMinManaging();
                tasks.Add(Task.Factory.StartNew(instance.Function));
            }
            await Task.WhenAll(tasks);

            watch.Stop();
            Console.WriteLine($"Done in {watch.ElapsedMilliseconds}");
        }
        public static async Task TestWithMinimumAsync()
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();

            // minimum number of threads speeds up in this case since we do not have to wait for every thread to be created after timeout
            ThreadPool.SetMinThreads(200, 200);

            var tasks = new List <Task>();

            for (var i = 0; i < 100; i++)
            {
                var instance = new ThreadpoolMinManaging();
                tasks.Add(Task.Factory.StartNew(instance.Function));
            }
            await Task.WhenAll(tasks);

            watch.Stop();
            Console.WriteLine($"Done in {watch.ElapsedMilliseconds}");
        }