Timer.Interval也是第一次运行该功能

Vis*_*har 5 .net c# windows-services timer intervals

我创建了一个Windows服务,每天需要在其中执行任务。因此,要完成我已经使用的Timer控制。

Timer tm = new Timer();
tm.Elapsed += new ElapsedEventHandler(OnElapsedTime);
tm.Interval = 86400000;
Run Code Online (Sandbox Code Playgroud)

但是这里的问题是,启动服务后,我必须等待一整天才能真正调用该函数。

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

提前致谢。

Sha*_*ngh 6

有两种方法可以做到。

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();
}
Run Code Online (Sandbox Code Playgroud)

2)您可以改用System.Threading.Timer该类。你可以这样使用它:

System.Threading.Timer tm = 
    new System.Threading.Timer(OnElapsedTime, null, 0, 86400000);
Run Code Online (Sandbox Code Playgroud)

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

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

System.Threading.Timer tm = 
    new System.Threading.Timer(OnElapsedTime, null, 120, 86400000);
Run Code Online (Sandbox Code Playgroud)

  • 如果此解决方案对您有帮助,请不要忘记将其标记为答案。 (2认同)

Dam*_*ith 5

您可以第一次运行该方法,然后启动计时器。因此,它将首先运行,并且计时器将在第二天再次运行。

或创建简单的控制台应用程序来执行任务。只需使用Windows计划任务即可exe每天运行一次

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

如何触发计时器立即过去的事件