5

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

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

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

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

提前致谢。

4

2 回答 2

6

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

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

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

如何立即触发 timer.Elapsed 事件

于 2013-06-01T06:27:04.200 回答
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();
}

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);
于 2013-06-01T07:02:48.353 回答