/// <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);
        }
Beispiel #2
0
        /// <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);
        }