Fire timer_elapsed немедленно из OnStart в службе Windows - PullRequest
11 голосов
/ 21 апреля 2011

Я использую System.Timers.Timer, и у меня есть код, подобный следующему, в моем методе OnStart в службе c # windows.

timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.Start();

Это приводит к тому, что код в timer_Elapsed будет выполняться каждый час, начиная с часа после запуска службы. Есть ли способ заставить его работать в тот момент, когда я запускаю службу, а затем каждый час?

Метод, вызванный timer_Elapsed, занимает слишком много времени, чтобы запустить его непосредственно из OnStart.

Ответы [ 4 ]

19 голосов
/ 21 апреля 2011

Просто запустите поток пула потоков для вызова рабочей функции, как это делает Timer. Как это:

        timer.Elapsed += timer_Elapsed;
        ThreadPool.QueueUserWorkItem((_) => DoWork());
    ...

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
        DoWork();
    }

    void DoWork() {
        // etc...
    }
2 голосов
/ 10 августа 2011

Используйте свойство 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 установит значение, указывающее, что таймер должен вызывать событие Elapsed каждый раз, когдауказанный интервал истекает.

1 голос
/ 21 апреля 2011

Используйте класс System.Threading.Timer вместо System.Timers.Timer, поскольку этот тип является просто оболочкой для таймера потоков.

Он также соответствует вашим требованиям.

 System.Threading.Timer timer =
                new System.Threading.Timer(this.DoWork, this, 0, 36000);

Здесь - это детали.

0 голосов
/ 02 июня 2015

Если вы хотите, чтобы ваш 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...