async Task <IEnumerable <ValidationRuleResult> > ExecuteAsManyParallelRulesAsPossibleAsync(ParallelExecutionContext parallelContext, CancellationToken cancellationToken) { var results = new List <ValidationRuleResult>(); do { var rulesInProgress = parallelContext.ParallelTodo .Select(rule => RuleExecutor.ExecuteRuleAsync(rule, ruleExecutor, parallelContext.ExecutionContext, cancellationToken)) .ToList(); parallelContext.ParallelTodo.Clear(); while (rulesInProgress.Any()) { var resultTask = await Task.WhenAny(rulesInProgress).ConfigureAwait(false); rulesInProgress.Remove(resultTask); var result = await resultTask.ConfigureAwait(false); results.Add(result); cancellationToken.ThrowIfCancellationRequested(); } } while (GetRulesTodo(parallelContext, returnTrueOnlyIfNewParallelRulesFound: true)); return(results); }
/// <inheritdoc/> public async Task <IReadOnlyCollection <ValidationRuleResult> > ExecuteAllRulesAsync(IRuleExecutionContext executionContext, CancellationToken cancellationToken = default) { var results = new List <ValidationRuleResult>(); for (var availableRules = executionContext.GetRulesWhichMayBeExecuted(); availableRules.Any(); availableRules = executionContext.GetRulesWhichMayBeExecuted()) { var ruleResults = await RuleExecutor.ExecuteRulesAsync(availableRules, ruleExecutor, executionContext, cancellationToken) .ConfigureAwait(false); results.AddRange(ruleResults); } return(results); }
/// <inheritdoc/> public async Task <IReadOnlyCollection <ValidationRuleResult> > ExecuteAllRulesAsync(IRuleExecutionContext executionContext, CancellationToken cancellationToken = default) { var parallelContext = new ParallelExecutionContext(executionContext); var results = new List <ValidationRuleResult>(); // See the XML 'remarks' comments on the class for a description of this algorithm. while (GetRulesTodo(parallelContext)) { var parallelResults = await ExecuteAsManyParallelRulesAsPossibleAsync(parallelContext, cancellationToken).ConfigureAwait(false); results.AddRange(parallelResults); var nonParallelResults = await RuleExecutor.ExecuteRulesAsync(parallelContext.NonParallelTodo, ruleExecutor, parallelContext.ExecutionContext, cancellationToken).ConfigureAwait(false); results.AddRange(nonParallelResults); parallelContext.NonParallelTodo.Clear(); } return(results); }