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();
}