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

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


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

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)) ?

Теги:


Спасибо:


tmt

Фотография
Дата: 08.02.2012
Ответить


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

vader

Фотография
Дата: 08.02.2012
Ответить


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

Это мой метод.
Он в вырезке кода приведен.
Спасибо:

tmt

Фотография
Дата: 08.02.2012
Ответить


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

Фотография
Дата: 08.02.2012
Ответить


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

vader

Фотография
Дата: 08.02.2012
Ответить


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

vader

Фотография
Дата: 08.02.2012
Ответить


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

Уже пробовал, все равно вызывается раз за разом.
И потом он не вызывает метод - обработчик. Который ReplaceOrder. Ни в случае true, ни в случае false
Спасибо:

tmt

Фотография
Дата: 08.02.2012
Ответить


тогда жди ответа специалистов, мне надо просто пробовать.. тыкать[smile]
Спасибо:

Alexander

Фотография
Дата: 10.02.2012
Ответить


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy