/// <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); }