从windows服务的OnStart立即触发timer_elapsed

本文关键字:timer elapsed windows 服务 OnStart | 更新日期: 2023-09-27 17:52:46

我使用的是System.Timers.Timer,并且我在c# windows服务中的OnStart方法中有如下代码:

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

这将导致timer_Elapsed中的代码从我启动服务后的一个小时开始每小时执行一次。有没有办法让它在我启动服务时执行,然后每小时执行一次?

timer_Elapsed调用的方法运行时间太长,不能直接从OnStart调用。

从windows服务的OnStart立即触发timer_elapsed

启动一个线程池线程来调用worker函数,就像Timer一样。这样的:

        timer.Elapsed += timer_Elapsed;
        ThreadPool.QueueUserWorkItem((_) => DoWork());
    ...
    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
        DoWork();
    }
    void DoWork() {
        // etc...
    }

使用System.Timers.Timer的AutoReset属性并将其值设置为"true"。不需要使用timer. start(),因为它和timer做同样的工作。启用= true;

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

AutoReset = true将设置一个值,指示Timer应该在每次指定的间隔时间过后引发Elapsed事件。

如果您想要立即触发Timer,那么您可以简单地初始化Timer对象,而不需要指定间隔(它将默认为100ms,几乎是立即:p),然后在调用函数中设置间隔为您喜欢的任何值。下面是我在Windows Service中使用的一个例子:

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

使用System.Threading.Timer类代替System.Timers.Timer,因为这种类型只是Threading Timer的一个包装。

它也符合你的要求。

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

简单。你所要做的就是手动调用事件函数一次。

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

它毕竟是一个函数。但是,如果您实际上是在创建一个windows服务,并且只希望它每小时触发一次,那么这是错误的方法。
你应该设置一个Windows循环任务。您可以将其配置为立即运行,也可以每小时运行一次。确保你知道你在做什么。我见过它设置不正确,所以它每小时运行一次,但在一天结束时运行两次。更多信息请看这个答案:https://stackoverflow.com/a/4250516/9008140