Есть ли способ запустить NRule Engine асинхронно?

Я хочу запускать все правила асинхронно, чтобы сделать их потокобезопасными.

Когда я выполняю нагрузочный тест, то почему 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();
        }

Могу ли я сделать вызов, как показано ниже:

сеанс.FireAsync();

или есть другой вариант запуска нескольких правил, но в асинхронном режиме? и класс NRuleRepository следует повторно инициализировать при каждом запросе?


person Ghanshyam Singh    schedule 28.08.2019    source источник


Ответы (1)


По крайней мере, вы могли бы использовать Task.Run() для создания потока для каждого экземпляра репозитория, но то, что вы делаете, кажется очень неэффективным.

Почему вы вставляете правило с данными в сеансе? Вы уже добавили правило в репозиторий.

Если у вас когда-либо есть единственное правило в репозитории, NRules почти наверняка является излишним, и вам лучше заняться чем-то другим.

person Nicholas Tyrrell    schedule 30.08.2019
comment
Ну, согласно спецификациям, данные всегда вставляются в сеанс, не так ли? - person Ghanshyam Singh; 30.08.2019
comment
Данные всегда вставляются в сеанс, я не обсуждаю это - я подчеркиваю, что вы вставляете правило вместе с ним, что совершенно не нужно. Вы должны вставить правила в репозиторий правил, который компилирует правила, а затем вы вставляете данные, которые хотите запустить через механизм правил, в сеанс. - person Nicholas Tyrrell; 30.08.2019
comment
Да, это то, что я делаю, позвольте мне разместить мой полный код на stackoverflow.com/questions/57722215. - person Ghanshyam Singh; 30.08.2019