在Windows服务的OnStart方法中立即启动计时器。

12

我正在使用一个 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 中调用。


在 timer.Start() 之后调用它会有任何问题吗? - V4Vendetta
5个回答

20

只需要启动一个线程池线程来调用工作函数,就像 Timer 所做的那样。像这样:

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

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

    void DoWork() {
        // etc...
    }

2

使用 System.Timers.Timer 的 AutoReset 属性,并将其值设置为“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事件。


2

如果您希望立即触发Timer,那么只需初始化Timer对象而不指定时间间隔(它将默认为100ms,几乎是立即触发: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();
}

1
使用System.Threading.Timer类代替System.Timers.Timer,因为该类型只是Threading Timer的包装器。
它也符合您的要求。
 System.Threading.Timer timer =
                new System.Threading.Timer(this.DoWork, this, 0, 36000);

这里是细节。


我尝试过,但至少在这里没有起作用。它在时间开始之前运行该方法,但是它在onStart()内部运行。 - Thiago

0
简单。您只需要手动调用一次您的事件函数即可。
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.Start();
timer_elapsed();

这毕竟是一个功能。 然而,如果你真的在创建一个Windows服务,并且只想让它每小时运行一次,那么这种方法是错误的。 你应该设置一个Windows定期任务。你可以配置它立即运行,并且每小时运行一次。确保你知道自己在做什么。我曾经见过设置错误的情况,导致它每小时运行两次。 查看这个答案获取更多信息: https://dev59.com/dm855IYBdhLWcg3wm1m3#4250516

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接