Я пытаюсь написать сервис на c #, который должен быть запущен через определенный интервал (тайм-аут) с указанной даты. Если дата наступит в будущем, служба должна подождать, пока не будет достигнута дата.
Пример:
Если я установлю тайм-аут на 1 час с 21:00:00, я хочу, чтобы программа запускалась каждый час
Если я установлю тайм-аут равным 1 часу с 3999.01.01 21:00:00, я хочу, чтобы программа работала до даты и затем запускалась каждый час
Я добился этого с помощью следующего кода, но у него есть некоторые проблемы!
При установке службы (с помощью installutil) служба помечается как начиная с из-за Thread.Sleep (). Эта служба, кажется, зависает и "устанавливает" до запуска.
Код внутри ServiceTimer_Tick () может занять больше времени, чем ожидалось. Как я могу предотвратить увеличение стека таймера, если это произойдет?
Альтернативы, о которых я думал:
включают использование 'timeout.Interval' в первый раз, а затем сброс его последующие вызовы, но это не так.
Я также рассмотрел возможность отказаться от всей идеи сервиса, скомпилировать ее как исполняемый файл и настроить запланированные задачи.
Сокращенный пример:
public Service()
{
_timeout = new TimeSpan(0,1,0,0);
_timer = new System.Timers.Timer();
_timer.Interval = _timeout.TotalMilliseconds;
_timer.Elapsed += new ElapsedEventHandler(ServiceTimer_Tick);
}
private void ServiceTimer_Tick(object sender, System.Timers.ElapsedEventArgs e)
{
lock (_obj)
{
// Stuff that could take a lot of time
}
}
public static void Main()
{
Run(new Service());
}
protected override void OnStart(string[] args)
{
long current = DateTime.Now.Ticks;
long start = new DateTime(2010,9,15,21,0,0).Ticks;
long timeout = _timeout.Ticks;
long sleep;
if (current > start)
sleep = timeout - ((current % timeout)) + (start % timeout);
else
sleep = start - current;
Thread.Sleep(new TimeSpan(sleep));
_timer.AutoReset = true;
_timer.Enabled = true;
_timer.Start();
}