0

我想异步运行所有规则以使其线程安全

当我执行负载测试时,为什么 RuleEngine 花费这么多时间来执行所有规则。

        NRuleRepository repository = null;
        foreach (var rule in rules)
        {                
            repository = new NRuleRepository();
            repository.LoadRules(rule.Rule);
            var factory = repository.Compile();
            var session = factory.CreateSession();
            NRuleBody data = null;
            foreach (var fact in rule.RuleDataList)
            {
                data = new NRuleBody();
                data.Rule = rule.Rule;
                data.RuleData = fact;
                session.Insert(data);
            }

            result += session.Fire();
        }

我可以拨打如下电话:

session.FireAsync();

还是有任何其他选项可以触发多个规则但异步?并且 NRuleRepository 类应该在每个请求上重新初始化?

4

1 回答 1

1

至少,您可以利用Task.Run()为存储库的每个实例创建一个线程,但是您所做的似乎非常低效。

为什么要在会话中插入带有数据的规则?您已将规则添加到存储库。

如果您在存储库中只有一个单一的规则,那么 NRules 几乎可以肯定是矫枉过正,而且您几乎可以做任何其他事情。

于 2019-08-30T09:18:41.250 回答