Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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());
        }