public async Task TestRunInParallel_ParallelismDegree(int totalTasks, int maxDegreeOfParallelism) { VisitorsCounter visitorsCounter = new VisitorsCounter(maxDegreeOfParallelism); await TaskUtils.RunInParallel(((Func <Task>)(async() => { visitorsCounter.Enter(); await Task.Delay(RUNNING_TIME); visitorsCounter.Leave(); })).Repeat(totalTasks), maxDegreeOfParallelism); Assert.Zero(visitorsCounter.CurrentVisitors); Assert.AreEqual(totalTasks, visitorsCounter.TotalVisitors); Assert.AreEqual(Math.Min(maxDegreeOfParallelism, totalTasks), visitorsCounter.MaxConcurrentVisitors); }
public void TestRunInParallel_ErrorHandling(ICollection <bool> whenToThrowException, int maxDegreeOfParallelism) { VisitorsCounter visitorsCounter = new VisitorsCounter(maxDegreeOfParallelism); IEnumerable <Func <Task> > opeartions = whenToThrowException.Select((toThrow) => (Func <Task>)(async() => { visitorsCounter.Enter(); await Task.Delay(RUNNING_TIME); visitorsCounter.Leave(); if (toThrow) { throw new ArgumentException(); } })); int errorsNumber = whenToThrowException.Count((b) => b); Assert.AreEqual(errorsNumber, Assert.ThrowsAsync <AggregateException>(() => TaskUtils.RunInParallel(opeartions, maxDegreeOfParallelism)).InnerExceptions.Count); Assert.Zero(visitorsCounter.CurrentVisitors); Assert.AreEqual(whenToThrowException.Count, visitorsCounter.TotalVisitors); Assert.AreEqual(Math.Min(maxDegreeOfParallelism, whenToThrowException.Count), visitorsCounter.MaxConcurrentVisitors); }