/// <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 delete a rule. If a 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> /// <param name="checkCanFinish">To check the possibility of rule suspension.</param> /// <returns><see langword="true" />, if a rule was successfully deleted, <see langword="false" />, if a rule cannot be currently deleted.</returns> public static bool TryRemoveRule(this IMarketRuleContainer container, IMarketRule rule, bool checkCanFinish = true) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (rule == null) { throw new ArgumentNullException(nameof(rule)); } var isRemoved = false; if ((!checkCanFinish && !rule.IsActive && rule.IsReady) || rule.CanFinish()) { container.Rules.Remove(rule); isRemoved = true; } if (isRemoved) { container.AddRuleLog(LogLevels.Debug, rule, LocalizedStrings.Str1084, rule); } return(isRemoved); }
/// <summary> /// Release resources. /// </summary> protected override void DisposeManaged() { _container.AddRuleLog(LogLevels.Debug, this, LocalizedStrings.Str1092); _container = null; base.DisposeManaged(); Holder.RuleStat.Remove(this); }
/// <summary> /// Initializes a new instance of the <see cref="MarketRuleList"/>. /// </summary> /// <param name="container">The rules container.</param> public MarketRuleList(IMarketRuleContainer container) { if (container == null) { throw new ArgumentNullException(nameof(container)); } _container = container; }
/// <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); } }
/// <summary> /// To form a rule (include <see cref="IMarketRule.IsReady"/>). /// </summary> /// <param name="rule">Rule.</param> /// <param name="container">The rules container.</param> /// <returns>Rule.</returns> public static IMarketRule Apply(this IMarketRule rule, IMarketRuleContainer container) { if (rule == null) { throw new ArgumentNullException(nameof(rule)); } if (container == null) { throw new ArgumentNullException(nameof(container)); } container.Rules.Add(rule); return(rule); }
/// <summary> /// To process rules in suspended mode (for example, create several rules and start them up simultaneously). After completion of method operation all rules, attached to the container resume their activity. /// </summary> /// <param name="container">The rules container.</param> /// <param name="action">The action to be processed at suspended rules. For example, to add several rules simultaneously.</param> public static void SuspendRules(this IMarketRuleContainer container, Action action) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (action == null) { throw new ArgumentNullException(nameof(action)); } container.SuspendRules(); try { action(); } finally { container.ResumeRules(); } }
/// <summary> /// To form a rule (include <see cref="IMarketRule.IsReady"/>). /// </summary> /// <typeparam name="TToken">The type of token.</typeparam> /// <typeparam name="TArg">The type of argument, accepted by the rule.</typeparam> /// <param name="rule">Rule.</param> /// <param name="container">The rules container.</param> /// <returns>Rule.</returns> public static MarketRule <TToken, TArg> Apply <TToken, TArg>(this MarketRule <TToken, TArg> rule, IMarketRuleContainer container) { return((MarketRule <TToken, TArg>)((IMarketRule)rule).Apply(container)); }
/// <summary> /// Initializes a new instance of the <see cref="MarketRuleList"/>. /// </summary> /// <param name="container">The rules container.</param> public MarketRuleList(IMarketRuleContainer container) { _container = container ?? throw new ArgumentNullException(nameof(container)); }