/// <summary> /// To delete the rule and all opposite rules. If the rule is executed at the time when this method is called, it will not be deleted. /// </summary> /// <param name="container">The rules container.</param> /// <param name="rule">Rule.</param> /// <returns><see langword="true" />, if rule was removed, otherwise, <see langword="false" />.</returns> public static bool TryRemoveWithExclusive(this IMarketRuleContainer container, IMarketRule rule) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (rule == null) { throw new ArgumentNullException(nameof(rule)); } if (container.TryRemoveRule(rule)) { if (rule.ExclusiveRules.Count > 0) { foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear())) { container.TryRemoveRule(exclusiveRule, false); } } return(true); } return(false); }
/// <summary> /// To activate the rule. /// </summary> /// <param name="container">The rules container.</param> /// <param name="rule">Rule.</param> /// <param name="process">The handler.</param> public static void ActiveRule(this IMarketRuleContainer container, IMarketRule rule, Func <bool> process) { if (process == null) { throw new ArgumentNullException(nameof(process)); } container.AddRuleLog(LogLevels.Debug, rule, LocalizedStrings.Str1082); List <IMarketRule> removedRules = null; // mika // проверяем правило, так как оно могло быть удалено параллельным потоком if (!rule.IsReady) { return; } rule.IsActive = true; try { if (process()) { container.Rules.Remove(rule); removedRules = new List <IMarketRule> { rule }; } } finally { rule.IsActive = false; } if (removedRules == null) { return; } if (rule.ExclusiveRules.Count > 0) { foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear())) { container.TryRemoveRule(exclusiveRule, false); removedRules.Add(exclusiveRule); } } foreach (var removedRule in removedRules) { container.AddRuleLog(LogLevels.Debug, removedRule, LocalizedStrings.Str1083); } }