У меня есть функция (скажем, foo()
), которая будет вызываться время от времени с переменным интервалом. Когда он вызывается, он проверяет время и предпринимает соответствующее действие.
Я сделал это следующим образом:
A Forms.Timer
объект вызывает функцию, когда требуется
Объект Diagnostics.Stopwatch
используется внутри функции с целью определения времени и решения, что делать.
Однако у меня возникает следующая проблема: когда по обратному вызову Timer вызывается foo()
, значение ElapsedMilliseconds
объекта секундомера обычно ниже ожидаемого. Например, таймер установлен на 1000, поэтому после 1000 мс вызывается foo()
, но в пределах foo()
body ElapsedMilliseconds
возвращает 900, поэтому foo
ведет себя так, как будто истекшее время было 900 (хотя оно должно выполнить действие A, поскольку 1000 мс фактически прошло, это не так)
Как я могу синхронизировать таймер и секундомер в том случае, если ElapsedMilliseconds имеет согласованное значение с таймером?
РЕДАКТИРОВАТЬ: некоторые код
Пример кода, объясняющего мою проблему:
//foo is the function that is called by timer's callback
public void foo()
{
//Let's see what time it is:
long currentTime = stopwatch.ElapsedMilliseconds();
Item = getCurrentItem(currentTime);
Item.Draw();
}
//this is the callback of timer
private void timer1_Tick(object sender, EventArgs e)
{
//set the timer for next time
timer1.Interval = Intervals[periodIdx++];
foo();
}
Предполагается, что каждый раз, когда интервал завершается, он рисует что-то еще, однако, поскольку ElapsedMilliseconds
возвращает более раннее значение, чем утверждения таймера, хотя интервал закончен, следующий элемент не рисуется