private async Task ExecuteParallelRules(IEnumerable <IGeneralRule <T> > rules) { foreach (var pRule in GetParallelRules(rules)) { await InvokeNestedRulesAsync(pRule.Configuration.InvokeNestedRulesFirst, pRule); if (pRule.CanInvoke(_model, _ruleEngineConfiguration.IsRuleEngineTerminated())) { await InvokePreactiveRulesAsync(pRule); ParallelRuleResults.Add(Task.Run(async() => { TraceMessage.Verbose(pRule, TraceMessage.BeforeInvokeAsync); await pRule.BeforeInvokeAsync(); TraceMessage.Verbose(pRule, TraceMessage.InvokeAsync); var ruleResult = await pRule.InvokeAsync(); TraceMessage.Verbose(pRule, TraceMessage.AfterInvokeAsync); await pRule.AfterInvokeAsync(); pRule.UpdateRuleEngineConfiguration(_ruleEngineConfiguration); ruleResult.AssignRuleName(pRule.GetType().Name); return(ruleResult); })); await InvokeReactiveRulesAsync(pRule); } await InvokeNestedRulesAsync(!pRule.Configuration.InvokeNestedRulesFirst, pRule); } }
public async Task <IRuleResult[]> GetAsyncRuleResults() { await Task.WhenAll(ParallelRuleResults); ParallelRuleResults.ToList().ForEach(rule => { rule.Result.AssignRuleName(rule.GetType().Name); AddToAsyncRuleResults(rule.Result); }); return(AsyncRuleResults.ToArray()); }