コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
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);
        }