2011-01-07 10 views
2

Ich erstelle einen anderen Windows-Dienst und mein Timer tickt nicht und ich habe keine Ahnung warum! Ich benutze system.timers.timer wie ich in früheren Diensten und es funktioniert nicht. Ich habe versucht, es anzufügen, aber es scheint nichts zu tun.System.Timers.Timer timer1_Elapsed feuert nicht! Hilfe!

Mein Code:

namespace ExpiryNotifier 
{ 
    public partial class ExpiryNotifier : ServiceBase 
    { 
     public ExpiryNotifier() 
     { 
      InitializeComponent(); 
      if (!System.Diagnostics.EventLog.SourceExists("ExpiryNotifier")) 
      { 
       System.Diagnostics.EventLog.CreateEventSource("ExpiryNotifier", "ExpiryNotifier"); 
      } 
      eventLog1.Source = "ExpiryNotifier"; 
      eventLog1.Log = "ExpiryNotifier"; 
     } 
     private Timer timer1 = new Timer(); 
     protected override void OnStart(string[] args) 
     { 
      eventLog1.WriteEntry("Service Started"); 
      timer1.Elapsed += timer1_Elapsed; 
      timer1.Interval = 10000; 
      timer1.Enabled = true; 

     } 

     protected override void OnStop() 
     { 
      eventLog1.WriteEntry("Service Stopped"); 
      timer1.Enabled = false; 

     } 

     private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      eventLog1.WriteEntry("timer tick"); 
      timer1.Stop(); 

      EmailerService.EmailerService service = new EmailerService.EmailerService(); 
      DataSet expiringQualifications = service.GetDetailsOfExpiringQualifications(); 

      if(expiringQualifications.Tables[0].Rows.Count>0) 
      { 
       foreach(DataRow rw in expiringQualifications.Tables[0].Rows) 
       { 
        if (!string.IsNullOrEmpty(rw["EmailAddress"].ToString())) 
        { 
         if (rw["QualAwardDescription"] != null) 
         { 
          service.SendQualExpiryEmail(rw["EmailAddress"].ToString(), rw["firstName"].ToString(), 
                 rw["QualAwardDescription"].ToString()); 
         } 
        } 
       } 
      } 


      timer1.Start(); 
     } 
    } 
} 

Kann jemand das Problem?

Vielen Dank im Voraus!

Bex

+1

Können Sie den Eintrag "Service Started" sehen? –

Antwort

7

System.Timers.Timer ist eine hässliche Timer. Eine unangenehme Sache, die es tut, schluckt Ausnahmen, die vom Elapsed Ereignishandler ausgelöst werden. Das wird Ihren Timer beenden, da Sie ihn beim Eingeben der Methode stoppen. Keine Benachrichtigung, es hört einfach auf zu arbeiten.

Sie müssen diesem Code mindestens eine Ausnahmebehandlung hinzufügen, damit Sie die Ausnahme protokollieren und den Dienst stoppen können.

Achten Sie auch auf den Fehler in Ihrer OnStart() - Methode, Sie fügen bei jedem Start des Dienstes einen Ereignishandler hinzu. Das Elapsed-Ereignis wird mehrmals ausgeführt, was eine gute Möglichkeit ist, etwas zu bombardieren.

Betrachten Sie System.Threading.Timer, es hat keines dieser Probleme.

+0

Danke, dass du mich auf den Fehler aufmerksam gemacht hast.Ich habe es zur Initialisierung verschoben und jetzt hat der Dienst tatsächlich angefangen zu arbeiten. Wird es in der Initialisierung in Ordnung sein? – Bex

+0

Wenn es funktioniert, dann ist es in Ordnung. Ändern Sie nur Enabled in OnStart/Stop. Und fügen Sie die Ausnahmebehandlung hinzu. –

0

System.Timers.Timer.Start() hat eine gleiche Funktion wie System.Timers.Timer.Enabled = true; System.Timers.Timer.Stop() hat die gleiche Funktion wie System.Timers.Timer.Enabled = false;

Diese beiden Methoden setzen die Enabled-Eigenschaft intern auf true oder false, wodurch der Timer gestartet oder gestoppt wird.

Überprüfen Sie, ob Sie die Berechtigung zum Schreiben in eventlog haben. Sie können auch im Ereignisprotokoll nach Fehlern suchen.

System.Timers.Timer ist nicht Thread-sicher. Stellen Sie sicher, dass Sie es richtig verwenden.

0

Es sieht aus wie es funktioniert, aber Sie wahrscheinlich eine bessere Möglichkeit, es zu debuggen. Wer weiß, vielleicht Ihre eventLog1 null ist

Aktualisieren Sie Ihre onstart enthalten diese

protected override void OnStart(string[] args) 
    { 
     foreach (string arg in args) 
     { 
      if (arg == "DEBUG_SERVICE") 
        DebugMode(); 

     } 

    #if DEBUG 
     DebugMode(); 
    #endif 

    eventLog1.WriteEntry("Service Started"); 
    timer1.Elapsed += timer1_Elapsed; 
    timer1.Interval = 10000; 
    timer1.Enabled = true; 

    } 

private static void DebugMode() 
{ 

    Debugger.Break(); 
} 

Nun, wenn Sie auf den Dienst treffen starten Sie einen Dialog erhalten werden gefragt, ob Sie anhängen möchten. Es ist einfacher zu versuchen als manuell zu befestigen.

+0

Ich habe es geschafft, den Dienst zu aktivieren, aber ich kann ihn nicht debuggen. Wenn ich es anhefte, trifft es keine Unterbrechungspunkte, obwohl es in das Ereignisprotokoll geschrieben wird, also weiß ich es, und wenn ich das debug.break hinzufüge, verursacht es den Dienst zum Absturz! – Bex

+0

Es macht nichts, es referenzierte das Clientprofil .net 4 und nicht die Vollversion, dies scheint der Grund zu sein, warum ich nicht debuggen konnte. – Bex