private async Task <bool> ExecuteRuleAsync(ValidationRule rule, ISet <object> failedTargets, ValidationResult validationResultAccumulator, SynchronizationContext syncContext) { // Skip rule if the target is already invalid and the rule is not configured to execute anyway if (failedTargets.Contains(rule.Target) && !ShouldExecuteOnAlreadyInvalidTarget(rule)) { // Assume that the rule is valid at this point because we are not interested in this error until // previous rule is fixed. SaveRuleValidationResultAndNotifyIfNeeded(rule, RuleResult.Valid(), syncContext); return(true); } var ruleResult = !rule.SupportsSyncValidation ? await rule.EvaluateAsync().ConfigureAwait(false) : rule.Evaluate(); SaveRuleValidationResultAndNotifyIfNeeded(rule, ruleResult, syncContext); AddErrorsFromRuleResult(validationResultAccumulator, rule, ruleResult); if (!ruleResult.IsValid) { failedTargets.Add(rule.Target); } return(true); }
private RuleResult ExecuteRuleCore(ValidationRule rule) { RuleResult result = RuleResult.Valid(); if (!rule.SupportsSyncValidation) { var completedEvent = new ManualResetEvent(false); rule.EvaluateAsync().ContinueWith(t => { result = t.Result; completedEvent.Set(); }); var isCompleted = completedEvent.WaitOne(AsyncRuleExecutionTimeout); if (!isCompleted) { throw new TimeoutException("Rule validation did not complete in specified timeout."); } } else { result = rule.Evaluate(); } return(result); }
private static Task <RuleResult> ExecuteRuleCoreAsync(ValidationRule rule) { Task <RuleResult> resultTask; if (!rule.SupportsSyncValidation) { resultTask = rule.EvaluateAsync(); } else { var tcs = new TaskCompletionSource <RuleResult>(); var result = rule.Evaluate(); tcs.SetResult(result); resultTask = tcs.Task; } return(resultTask); }