Timer.Interval也是第一次运行该函数

时间:2013-06-01 06:22:24

标签: c# .net timer windows-services intervals

我创建了一个Windows服务,我需要每天执行任务。所以为了实现这一点,我使用了Timer控件。

Timer tm = new Timer();
tm.Elapsed += new ElapsedEventHandler(OnElapsedTime);
tm.Interval = 86400000;

但问题是,在我启动服务后,我必须等待整整1天来实际调用该功能。

那么有没有一种方法可以在我启动服务时调用该函数,而不必等到间隔时间结束。

提前致谢。

2 个答案:

答案 0 :(得分:5)

您可以首次运行该方法,然后启动计时器。所以它会进行第一次运行,计时器将在第二天再次运行。

或者创建简单的控制台应用程序来完成任务。只需使用Windows预定任务,您就可以每天运行exe

另一个选择是在启动计时器后立即调用事件

How to fire timer.Elapsed event immediately

答案 1 :(得分:3)

有两种方法可以做到。

1)OnElapsedTime中的代码,将其放在另一个方法中,并在启动计时器后立即调用该方法。例如,将代码放在TimerCalled方法中,然后使用:

static void Main(string[] args)
{
    Timer tm = new Timer();
    tm.Elapsed += new ElapsedEventHandler(OnElapsedTime);
    tm.Interval = 86400000;
    TimerCalled();
}

private static void OnElapsedTime(object source, ElapsedEventArgs e)
{
    TimerCalled();
}

2)您可以改用System.Threading.Timer课程。您可以像这样使用它:

System.Threading.Timer tm = 
    new System.Threading.Timer(OnElapsedTime, null, 0, 86400000);

但请注意System.Threading.Timer在单独的线程上运行。因此,任何从该线程更新UI elements的尝试都会导致错误。您应该通过Dispatcher或其他方式将UI元素更新(如果有)委托给UI线程。

更新: 如果您想在服务启动后几分钟开始,您可以提供几分钟的延迟:

System.Threading.Timer tm = 
    new System.Threading.Timer(OnElapsedTime, null, 120, 86400000);