Таймер бесполезен, потому что вы будете опрашивать слишком много раз и пропустите изменение / возврат обратно.
Вы должны будете инкапсулировать настройку переменной.
Таким образом, вы можете реагировать на изменения переменной.
class A
{
private double _tantheta; // add public getter
private bool _checkBoundaries; // add public getter/setter
public event EventHandler TanThetaWentOutOfBounds;
public void SetTantheta(double newValue)
{
if(_checkBoundaries &&
(newValue < 0.6 || newValue > 1.5))
{
var t = TanThetaWentOutOfBounds;
if(t != null)
{
t(this, EventArgs.Empty);
}
}
else
{
_tantheta = newValue;
}
}
Теперь все, что вам нужно сделать, это подписаться на событие TanThetaWentOutOfBounds этого класса и установить для CheckBoundaries значение true или false.
Обратите внимание, что этот код не устраняет проблем с многопоточностью, поэтому вам может потребоваться добавить некоторые блокировки в зависимости от того, как вы используете класс.
Существует три способа обработки трехсекундных периодов:
В обработчике TanThetaWentOutOfBounds (некотором другом классе, который регистрируется для события) отслеживают время предыдущего обновления и принимают меры только тогда, когда событие возникает в течение 3 секунд с начала измерения. Таким образом, ответственность за реализацию периода возлагается на потребителя.
Вы можете решить поднять событие, только если прошло менее 3 секунд с момента предыдущего события. Таким образом, вы ограничиваете всех потребителей тем периодом, который вы используете в рейзере. Обратите внимание, что я использовал DateTime.Now, чтобы получить время, это не так точно, как класс секундомера.
Код:
class A
{
private double _tantheta; // add public getter
private DateTime _lastRaise = DateTime.MinValue;
private bool _checkBoundaries; // add public getter/setter
public event EventHandler TanThetaWentOutOfBounds;
public void SetTantheta(double newValue)
{
if(_checkBoundaries &&
(newValue < 0.6 || newValue > 1.5))
{
var t = TanThetaWentOutOfBounds;
if(t != null)
{
var now = DateTime.Now;
if((now - _lastRaise).TotalSeconds < 3)
{
t(this, EventArgs.Empty);
_lastRaise = now;
}
}
}
else
{
_tantheta = newValue;
}
}