none
Timer funktioniert nicht mehr RRS feed

  • Frage

  • Hallo zusammen,
    mal wieder plagt mich das .net Framework... :-)

    Ich habe eine Methode, die mit Hilfe eines System.Timers.Timer im Abstand von 5 Sekunden einen SQL Server anpollt. Das kappt meist auch, nur manchmal feuert der Timer einfach keinen Event mehr. Er ist wie tot...

    public void Foo() {
      this.timer.Stop();
    
      //Poll database
      //Do other jobs...
    
      this.timer.Start();
      Console.Writeline(this.Timer.Enabled);
    }

    Ich habe einige dieser Konstrutke, aber nur dieser eine mach Probleme. Ich bin für jeden Tipp dankbar.

    Das Programm läuft auf einer .net 4.5 Runtime auf einem Windows Server 2008 R2


    Viele Grüße Holger M. Rößler


    Freitag, 28. Februar 2014 09:16

Antworten

  • Hallo Holger,

    ist denn sichergestellt, dass die Timerinstanz und/oder die Instanz der Klasse, die den Timer enthält, überhaupt noch existiert?

    Wird ggfs. das Intervall des Timer verändert? Oder wird der Timer gar per <Timer>.Enabled = False deaktiviert?

    Ist die Zuordnung zum EventHandler ggfs. auch verlorengegangen bzw. entfernt worden?

    Häng dich doch mal in alle Ereignisse deiner Klasse und in das Disposed Ereignis des Timers rein und setz Breakpoints.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 28. Februar 2014 21:51
    Moderator
  • Hallo Holger,

    ergänzend zu Stefans Antwort:

    Ich würde einen Try Finally Block drumherum setzen:

    public void Foo() {
          this.timer.Stop();
          try
          {
          //Poll database
          //Do other jobs...
          }
          finally
          {
             this.timer.Start();
             Console.Writeline(this.Timer.Enabled);
          }
    }

    nur für den Fall, das was schief geht und erst ein Exception Handler weiter oben greift.

    Gruß Elmar

    Sonntag, 2. März 2014 16:51
    Beantworter

Alle Antworten

  • Hallo Holger,

    ist denn sichergestellt, dass die Timerinstanz und/oder die Instanz der Klasse, die den Timer enthält, überhaupt noch existiert?

    Wird ggfs. das Intervall des Timer verändert? Oder wird der Timer gar per <Timer>.Enabled = False deaktiviert?

    Ist die Zuordnung zum EventHandler ggfs. auch verlorengegangen bzw. entfernt worden?

    Häng dich doch mal in alle Ereignisse deiner Klasse und in das Disposed Ereignis des Timers rein und setz Breakpoints.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 28. Februar 2014 21:51
    Moderator
  • Hallo Stefan, Vielen Dank für deine Antwort. Ja, der Timer ist eine Klasseninstanz. Dieser wird im Konstruktor initialisiert und ruft alle 5 Sekunden die im Post genannte Methode "Foo" auf. Dort wird der Timer dann gestoppt, der restl. Code abgearbeitet und der Timer wieder gestartet. Sonst wird der Timer nirgends mehr verwendet. Aber das mit dem Dispose ist ne gute Idee, das werde ich mal probieren. Was mich irritiert ist ja, das der Timer manchmal Stundenlang funktioniert und nach einem Neustart der Applikation nach wenigen Minuten keine Ausgabe mehr von "Foo" kommt. Leider erhalte ich keine Fehlermeldung, keine Exception, nichts.

    Viele Grüße Holger M. Rößler

    Sonntag, 2. März 2014 12:15
  • Hallo Holger,

    ergänzend zu Stefans Antwort:

    Ich würde einen Try Finally Block drumherum setzen:

    public void Foo() {
          this.timer.Stop();
          try
          {
          //Poll database
          //Do other jobs...
          }
          finally
          {
             this.timer.Start();
             Console.Writeline(this.Timer.Enabled);
          }
    }

    nur für den Fall, das was schief geht und erst ein Exception Handler weiter oben greift.

    Gruß Elmar

    Sonntag, 2. März 2014 16:51
    Beantworter
  • Hallo Stefan, hallo Elmar,

    vielen Dank nochmals für eure Antworten. Ich habe zuerst ohne den try-finally Block getestet. Das Dispose event ist zur Laufzeit ist niemals aufgerufen worden...

    Ich habe danach den Code, angelehnt an Elmars Vorschlag in einen try-catch-finally block gesetzt (in der Hoffnung, dass doch eine Exception geworfen wird --> leider Fehlanzeige). Nun scheint die Sache dank des finally-Blocks zu laufen.

    Vielen Dank an euch beide :)



    Viele Grüße Holger M. Rößler

    Montag, 3. März 2014 19:14