Fire timer_lapsed немедленно из OnStart в службе Windows
Я использую System.Timers.Timer
, и у меня есть код, похожий на следующий в моем методе OnStart
в службе windows С#.
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.Start();
Это приводит к тому, что код в timer_Elapsed
выполняется каждый час, начиная с часа после запуска службы. Есть ли способ заставить его выполнить в тот момент, когда я запускаю службу, а затем каждый час?
Метод, вызываемый timer_Elapsed
, занимает слишком много времени, чтобы запустить его, чтобы вызвать его непосредственно из OnStart
.
Ответы
Ответ 1
Просто запустите поток threadpool, чтобы вызвать рабочую функцию, как и Timer. Вот так:
timer.Elapsed += timer_Elapsed;
ThreadPool.QueueUserWorkItem((_) => DoWork());
...
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
DoWork();
}
void DoWork() {
// etc...
}
Ответ 2
Используйте свойство AutoReset для параметра System.Timers.Timer и установите для него значение "true".
Нет необходимости использовать timer.Start(), потому что он выполняет ту же работу, что и timer.Enabled = true;
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.AutoReset = true;
AutoReset = true установит значение, указывающее, что таймер должен поднять Истекшее событие каждый раз, когда истечет указанный интервал.
Ответ 3
Использовать класс System.Threading.Timer вместо System.Timers.Timer, поскольку этот тип является всего лишь оболочкой для Threading Timer.
Он также подходит для вашего требования.
System.Threading.Timer timer =
new System.Threading.Timer(this.DoWork, this, 0, 36000);
Здесь указаны детали.
Ответ 4
Если вы хотите, чтобы ваш Timer
был запущен немедленно, вы можете просто просто инициализировать объект Timer
без определенного интервала (по умолчанию он будет равен 100 мс, который почти сразу: P), а затем установите интервал внутри вызываемого функцию, которая вам нравится. Вот пример того, что я использую в своей службе Windows:
private static Timer _timer;
protected override void OnStart(string[] args)
{
_timer = new Timer(); //This will set the default interval
_timer.AutoReset = false;
_timer.Elapsed = OnTimer;
_timer.Start();
}
private void OnTimer(object sender, ElapsedEventArgs args)
{
//Do some work here
_timer.Stop();
_timer.Interval = 3600000; //Set your new interval here
_timer.Start();
}