Я пытаюсь написать службу на С #, которая должна запускаться в заданном интервале (тайм-аут) с заданной даты. Если дата находится в будущем, служба должна дождаться запуска до наступления даты и времени.
Пример:
Если я установил тайм-аут на 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();
}