コード例 #1
0
        public void Run_UpToConcurrencyLimit()
        {
            var scheduler = new LimitedConcurrencyTaskScheduler(CoreCount);
            var tasks     = CreateTasks(CoreCount, SleepThenReturnStartTime);
            var baseline  = DateTime.UtcNow;

            var startTimes = RunTasks(tasks, scheduler);

            startTimes.Count(t => t < baseline + GraceTime).Should().Be(CoreCount);
        }
コード例 #2
0
        private static T[] RunTasks <T>(Task <T>[] tasks, LimitedConcurrencyTaskScheduler scheduler)
        {
            scheduler.CurrentConcurrencyLevel.Should().Be(0);

            foreach (var task in tasks)
            {
                task.Start(scheduler);
            }

            scheduler.CurrentConcurrencyLevel.Should().BeGreaterThan(0);
            scheduler.CurrentConcurrencyLevel.Should().BeLessOrEqualTo(scheduler.MaximumConcurrencyLevel);

            Task.WaitAll(tasks);

            scheduler.CurrentConcurrencyLevel.Should().Be(0);

            return(tasks
                   .Select(t => t.Result)
                   .ToArray());
        }
コード例 #3
0
        public void MaximumConcurrencyLevel()
        {
            var scheduler = new LimitedConcurrencyTaskScheduler(42);

            scheduler.MaximumConcurrencyLevel.Should().Be(42);
        }