我想异步运行所有规则以使其线程安全
当我执行负载测试时,为什么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类应在每个请求上重新初始化?
答案 0 :(得分:1)
至少,您可能可以利用Task.Run()
为存储库的每个实例创建一个线程,但是您所做的工作似乎效率很低。
为什么要在会话中插入带有数据的规则?您已经将规则添加到存储库中。
如果您在存储库中仅使用单一规则,则NRules几乎肯定是过大了,并且最好执行几乎所有其他操作。