2016-04-18 2 views
1

Я только начал разрабатывать службу Windows. Но я не уверен, могу ли я использовать несколько таймеров в методе Onstart()?C# - Несколько таймеров в службе Windows

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 
 
     }

fonction1 и fonction2 бежать в то же самое время, но они не имеют один и тот же интервал запуска. Их последующее время начала не должно быть синхронизировано. В этом случае

  1. Могу ли я использовать 2 таймера в методе OnStart()?
  2. И если да, то fonction1, который обычно запускается каждые 30 секунд, должен подождать конца fonction2 для следующего запуска?

Мне нужно запустить эти 2 метода с разными интервалами в одной службе Windows.

ответ

1

Я не вижу причин, почему нет. System.Timers.Timer поднять событие в отдельном потоке от ThreadPool, чтобы они были независимы друг от друга. Единственное, что вам нужно, чтобы код в вашем обратном вызове не выполнялся дольше, чем 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 равно нулю, то Прошедшее событие возникает на ThreadPool нить. Если обработка события Elapsed длится дольше Interval, событие может быть снова поднято в другом потоке ThreadPool. В этой ситуации обработчик события должен быть реентерабельным.

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

1

Да, вы можете использовать любое количество таймеров - они абсолютно независимы

Смежные вопросы