LoneRay
@LoneRay
Начинающий кодировщик.

Как определить промежуток времени в (System.Timers.Timer)?

Вот допустим у меня есть вот такой код. Как мне определить, что в таймере прошло уже 10 секунд и выполнить какие-либо действия?
s500A2.Interval = 25000;
 s500A2.Elapsed += "функция";
s500A2.Start();
  • Вопрос задан
  • 610 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Интервал указывается в миллисекундах. Одна секунда равняется 1 000 миллисекунд.
Соответственно 25 000 миллисекунд - это 25 секунд.

// счетчик секунд
int secondsCounter = 0;

var s500A2 = new System.Timers.Timer();

// интервал - одна секунда
s500A2.Interval = 1000;

// обработчик истечения интервала
s500A2.Elapsed += (sender, e) => { // имена sender и e можно поменять, если будут проблемы
  Console.WriteLine("Прошла секунда");

  // увеличиваем значение счетчика
  secondsCounter++;

  if (secondsCounter >= 10)
  {
    Console.WriteLine("Всего прошло 10 секунд");
    secondsCounter = 0;
  }
};

s500A2.Start();

Либо можно установить Interval в значение 10 000, тогда Elapsed будет вызываться каждые 10 секунд.

Однако с точность все не так просто. Есть незначительная погрешность (в миллисекундах), которая со временем будет расти и в какой-то момент может потеряться секунда. Если точность критична, то лучше использовать меньшие значения.

Следующий пример демонстрирует погрешность относительно текущего времени:

// интервал - одна секунда
s500A2.Interval = 1000;

s500A2.Elapsed += (sender, e) => {
  Console.WriteLine("Прошла секунда: {0:HH:mm:ss.fff}", DateTime.Now);
};

// На выходе будет примерно это:
// Прошла секунда: 14:18:20.950
// Прошла секунда: 14:18:21.964
// Прошла секунда: 14:18:22.978
// Прошла секунда: 14:18:23.992 
// Прошла секунда: 14:18:25.006 // потеряли 14:18:24
// Прошла секунда: 14:18:26.020
// Прошла секунда: 14:18:27.034

В следующем примере показано решение проблемы с потерей секунд:

int lastSecond = 0;
// интервал - десять миллисекунд
s500A2.Interval = 10;

s500A2.Elapsed += (sender, e) => {
  int currentSecond = DateTime.Now.Second;

  if (currentSecond != lastSecond)
  {
    Console.WriteLine("Прошла секунда: {0:HH:mm:ss.fff}", DateTime.Now);
    lastSecond = currentSecond;
  }
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы