Я пытаюсь написать службу в C#, которая должна запускаться на заданный интервал (таймаут) с заданной даты. Если дата в будущем, служба должна ждать, пока она не будет достигнута.Синхронизация службы с таймером
Пример:
Если установить тайм-аут, чтобы быть 1 час от 21:00:00 Я хочу, чтобы запустить программу каждый час
Если установить тайм-аут, чтобы быть 1 час от 3999.01.01 21:00:00 Я хочу программу до до даты и с тех пор не запускать каждый час
Я вроде добился того, что с помощью следующего кода, но она имеет некоторые Prob лемы!
Когда я установить службу (с 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();
}
Я не очень понимаю, что вы привязывания достичь. Год 3999? Что делает тайм-аут? .... Это может быть связано: [Как генерировать событие в определенное время в C#?] (Http://stackoverflow.com/questions/1297109) – dtb
Я просто установил дату/год, который, очевидно, был бы будущее - вместо этого это смутило вас и, возможно, многих других. – Makach