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


Как использовать When(Func(Boolean)), TimeSpan)
Atom
2/8/2012


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

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

Tags:


Thanks:


tmt

Avatar
Date: 2/8/2012
Reply


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

vader

Avatar
Date: 2/8/2012
Reply


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

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

tmt

Avatar
Date: 2/8/2012
Reply


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

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


Code
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;
        }
Thanks:

tmt

Avatar
Date: 2/8/2012
Reply


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

vader

Avatar
Date: 2/8/2012
Reply


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

vader

Avatar
Date: 2/8/2012
Reply


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

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

tmt

Avatar
Date: 2/8/2012
Reply


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

Alexander

Avatar
Date: 2/10/2012
Reply


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy