← Назад

Как использовать When(Func(Boolean)), TimeSpan)

Написал такой код, но он работает не так, как я ожидал. Видимо это связано с тем, что я не понимаю сиснтаксис работы с правилами


this.When(() => IsRuleActual(order), _waitingPeriod)
                .Do(() => ReplaceOrder(order))
                .Once()
                .Sync(syncRules);

 private bool IsRuleActual(Order order)
        {
            bool isRuleActual = (order.State == OrderStates.Active);
            WriteDiagnostics("IsRuleActual " + isRuleActual.ToString());
            return isRuleActual;
        }

Я ожидал, что спустя указанный промежуток времени, будет вызван метод IsRuleActual, и если он вернет true, то будет вызван обработчик правила - ReplaceOrder. И ещё я ожидал, что метод IsRuleActual будет вызыватся один раз, но он вызывается каждые 30 секунд(в моём случае).

Скажите пожалуйста, как с помощью When(Func<Boolean>), TimeSpan) создать правило, которое при верности условия, вызвыает метод и делает это один раз? и как синхронизировать это правило (т.к. я полагаю, что эта строка тоже не работает Sync(syncRules)) ?

Комментарии (8)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

tmt
tmt

IsRuleActual - а это что такое вообще? я не нашел в документации и в пс тоже

vader
vader Автор

tmt: IsRuleActual - а это что такое вообще? я не нашел в документации и в пс тоже Это мой метод. Он в вырезке кода приведен.

tmt
tmt

vader:

tmt: IsRuleActual - а это что такое вообще? я не нашел в документации и в пс тоже Это мой метод. Он в вырезке кода приведен.

this.When(() => IsRuleActual(order), _waitingPeriod)
                .Do(() => ReplaceOrder(order))
                .Once()
                .Sync(syncRules);
 
 private bool IsRuleActual(Order order)
        {
            //bool isRuleActual = (order.State == OrderStates.Active); это мне как то не понятно.. я бы вот так сделал
            bool isRuleActual;
            if(order.State == OrderStates.Active){ isRuleActual = false; } else { isRuleActual = true; }
            WriteDiagnostics("IsRuleActual " + isRuleActual.ToString());
            return isRuleActual;
        }
tmt
tmt

хотя все верно, просто у тебя там всегда тру (тесть активный ордер, вот у тебя и вызывается каждые 30 сек) попробуй вместо == поставить !=

vader
vader Автор

tmt: хотя все верно, просто у тебя там всегда тру (тесть активный ордер, вот у тебя и вызывается каждые 30 сек) попробуй вместо == поставить != Уже пробовал, все равно вызывается раз за разом. И потом он не вызывает метод - обработчик. Который ReplaceOrder. Ни в случае true, ни в случае false

vader
vader Автор

tmt, это наследние от языкка С. Вот это выражение - order.State == OrderStates.Active вернет результат сравения. Так короче, а результат будет один и тот же.

tmt
tmt

тогда жди ответа специалистов, мне надо просто пробовать.. тыкать🙂

Alexander
Alexander

Исправлено, перевыложу сейчас 4.0.18