← Zurück

Правило которое проверяет условие с определенным онтервалом

В прошлых версиях было так: .When(() => a == b, TimeSpan.FromSeconds(1)).Do... Как теперь создать такое же правило?

War dieses Thema hilfreich?

Thema teilen

Kommentare (7)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Moadip
Moadip

Никак. Писать свое правило.

Вот как пример класса, с нужным правилом.


    internal static class Rules
    {
        public static StrategyRule<ITrader> WhenTimeToCheck(this Strategy strategy, Func<bool> condition, TimeSpan interval)
        {
            if (strategy == null)
            {
                throw new ArgumentNullException("strategy");
            }
            return new TimeToCheckRule(strategy.Trader, condition, interval);
        }

        private sealed class TimeToCheckRule : StrategyRule<ITrader>
        {
            private readonly MarketTimer _marketTimer;
            private readonly ITrader _trader;
            private readonly Func<bool> _condition;
            private readonly TimeSpan _interval;

            public TimeToCheckRule(ITrader trader, Func<bool> condition, TimeSpan interval)
            {
                if (trader == null) throw new ArgumentNullException("trader");
                if (condition == null) throw new ArgumentNullException("condition");

                _trader = trader;
                _condition = condition;
                _interval = interval;

                Name = "Интервал условие " + interval;

                _marketTimer = new MarketTimer(_trader, Activator).Interval(interval).Start();
            }

            private void Activator(MarketTimer marketTimer, bool flag)
            {
                if (flag)
                {
                    marketTimer.FirstTime(_trader.MarketTime + _interval);
                }
                else if (_condition.Invoke())
                {
                    Activate(_trader);
                }
            }

            protected override void DisposeManaged()
            {
                _marketTimer.Dispose();
                base.DisposeManaged();
            }
        }
    }

InsiderHSE
Alexander
Alexander

Как это никак? А WhenIntervalElapsed чем не устраивает? :)

InsiderHSE
InsiderHSE Autor

Alexander Mukhanchikov: Как это никак? А WhenIntervalElapsed чем не устраивает? :) Оно активируется по истечении определенных промежутков времени и вызывает Do. А нужно, чтобы Do вызывался только если условие верно...

Кот Матроскин
Кот Матроскин

InsiderHSE:

Alexander Mukhanchikov: Как это никак? А WhenIntervalElapsed чем не устраивает? :) Оно активируется по истечении определенных промежутков времени и вызывает Do. А нужно, чтобы Do вызывался только если условие верно... А если прямо в Do влепить проверку на это условие?

if(условие)
{
   действия
}
InsiderHSE
InsiderHSE Autor

Кот Матроскин:

InsiderHSE:

Alexander Mukhanchikov: Как это никак? А WhenIntervalElapsed чем не устраивает? :) Оно активируется по истечении определенных промежутков времени и вызывает Do. А нужно, чтобы Do вызывался только если условие верно... А если прямо в Do влепить проверку на это условие?

if(условие) { действия }

Так тоже можно, но менее читабельно =)
Кот Матроскин
Кот Матроскин

InsiderHSE: Так тоже можно, но менее читабельно =) Зато правило на 50 строчек писать не нужно)))

Alexander
Alexander

Да, тогда сори. Верно, надо свой правило писать.