Fire timer_立即从Windows服务中的OnStart中获取

时间:2011-04-21 10:23:48

标签: c# windows-services timer

我正在使用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调用它。

4 个答案:

答案 0 :(得分:19)

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

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

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

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

答案 1 :(得分: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将设置一个值,表示每当指定的间隔过去时,Timer应该提升Elapsed事件。

答案 2 :(得分:1)

使用System.Threading.Timer类而不是System.Timers.Timer,因为此类型只是线程计时器的包装器。

它也符合您的要求。

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

Here是详细信息。

答案 3 :(得分:0)

如果您希望立即触发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();
}