Точные трехминутные интервалы времени - PullRequest
0 голосов
/ 15 февраля 2012

В моем предыдущем вопросе Я спросил о значении времени округления до ближайшей третьей минуты. Что ж, теперь у меня есть некоторые проблемы с моим System.Threading.Timer, которые должны работать, когда наступит третья минута. Я делаю следующее:

private System.Timers.Timer WorkTimer;
//...
public void StartProccessing()
{
WorkTimer = new System.Timers.Timer();
WorkTimer.AutoReset = false;
WorkTimer.Elapsed += new ElapsedEventHandler(WorkTimer_Elapsed);
StartWorkTimer();
}
//...
private void StartWorkTimer()
        {
            WorkTimer.Interval = (CurrentTime.AddMinutes(3) - DateTime.Now).TotalMilliseconds;
            WorkTimer.Start();
        }
void WorkTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            WorkTimer.Stop();
            this.ProcessData(this.CurrentTime);
            StartWorkTimer();
        }

Проблема в том, что когда таймер запущен - он не работает в первую третью минуту, он начинает работать после второй третьей минуты. Например: Таймер запускается 15.02.2012 12: 20: 32.871, 15.02.2012 12: 21: 00.000 он должен работать WorkTimer_Elapsed, но его начало с 15.02.2012 12: 24: 01.871. Как это исправить? Я фиксирую свое текущее время (из предыдущего вопроса):

private DateTime CurrentTime
        {
            get
            {
                DateTime now = DateTime.Now.AddSeconds(30);
                DateTime val;
                val = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0)
                     .AddMinutes(((now.Minute) / 3) * 3 - now.Minute);
                return val;
            }
        }

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Проблема здесь в том, что вы округляетесь до ближайшей 3-й минуты, но для того, чтобы ваш таймер работал, вы должны использовать самую последнюю.

Итак, если вы удалите AddSeconds(30), ваш таймер долженработать как положено.

Примечание: ваш алгоритм округления должен добавить 90 секунд (то есть половину 3 минуты), а не 30. Если вы добавляете 30 секунд к 12:31:50, выв конечном итоге с 12:30:00, но вместо этого должно быть 12:33:00.

0 голосов
/ 15 февраля 2012

Используйте класс System.Threading.Timer.

DateTime dt = ... // here you assign the start time, so you can calculate
                  // the first time you want to start it.
var timer = new Timer(callback, null, dt, TimeSpan.FromMinutes(3));

Обратный звонок:

public delegate void TimerCallback(Object state)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...