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

我正在使用System.Timers.Timer ,我在ac#windows服务的OnStart方法中得到了如下代码。

 timer = new Timer(); timer.Elapsed += timer_Elapsed; timer.Enabled = true; timer.Interval = 3600000; timer.Start(); 

这导致timer_Elapsed的代码从我启动服务后的一小时开始每小时执行一次。 有没有办法让它在我启动服务时执行,然后每小时执行一次?

timer_Elapsed调用的方法运行时间太长,无法直接从OnStart调用它。

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

  timer.Elapsed += timer_Elapsed; ThreadPool.QueueUserWorkItem((_) => DoWork()); ... void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { DoWork(); } void DoWork() { // etc... } 

使用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事件。

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

它也适合您的要求。

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

这是细节。

如果你想让你的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(); }