C# - Windows服务中的多个计时器

时间:2016-04-18 23:11:12

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

我刚开始开发一个Windows服务。但我不确定我是否可以在Onstart()方法中使用多个计时器?



private System.Timers.Timer timer1;
private System.Timers.Timer timer2;


        protected override void OnStart(string[] args)
        {
            this.timer1 = new System.Timers.Timer(30000);  // every 30 seconds
            this.timer1.AutoReset = true;
            this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(fonction1);
            this.timer1.Start();
          
          
          this.timer2 = new System.Timers.Timer(10 * 60 * 1000); // every 10 minutes
            this.timer2.AutoReset = true;
            this.timer2.Elapsed += new System.Timers.ElapsedEventHandler(fonction2);
            this.timer2.Start();
          
          
        }


       private void fonction1(object sender, System.Timers.ElapsedEventArgs e)
        {
            bla bla
        }

       private void fonction2(object sender, System.Timers.ElapsedEventArgs e)
        {
            bla bla
        }




fonction1fonction2同时运行,但它们没有相同的运行间隔。他们随后的开始时间不需要同步。在这种情况下,

  1. 我可以在OnStart()方法中使用2个计时器吗?
  2. 如果是这样,通常每30秒运行一次的fonction1是否必须等到fonction2结束到下一次开始?
  3. 我需要在同一个Windows服务中以不同的间隔运行这两种方法。

2 个答案:

答案 0 :(得分:1)

是的,您可以使用任意数量的计时器 - 它们绝对是独立的

答案 1 :(得分:1)

我没有看到原因。 System.Timers.TimerThreadPool的单独帖子中引发一个事件,因此它们彼此独立。您唯一需要确保回调中的代码执行时间不会超过Interval。如果您认为可能发生这种情况,则需要在事件处理程序中停止计时器并最终重新创建它。

private System.Timers.Timer timer1;

protected override void OnStart(string[] args)
{
    this.timer1 = new System.Timers.Timer(30000) { AutoReset = false };
    this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
    this.timer1.Start(); 
}

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    try 
    {
        // Do Work
    }
    catch (Exception ex) 
    {
        // Logging
    }
    finally 
    {
        timer1.Start()
    }
}
  

如果SynchronizingObject属性为null,则在ThreadPool线程上引发Elapsed事件。如果Elapsed事件的处理持续时间超过Interval,则可能会在另一个ThreadPool线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx