2016-12-13 14 views
0

Ich habe ein sehr einzigartiges Problem konfrontiert. Ich verwende einen System.Timers.Timer, der jede Minute eine Methode auslöst. Allmählich wurde mir klar, dass das Zeitintervall nicht konstant ist.System.Timers.Timer allmählich zunehmendes Intervall?

Zum Testen und Sicherstellen des Problems, ich nur einen Timer, der jede Minute eine Funktion ausgeführt hat. Und die Ausgabe war schockierend, die Timer-Intervall-Sekunden sind nicht konstant. Sie verändern sich also und verursachen ein Problem.

12/13/2016 3:39:26 PM 
12/13/2016 3:40:25 PM 
12/13/2016 3:41:25 PM 
12/13/2016 3:42:25 PM 
12/13/2016 3:43:25 PM 
12/13/2016 3:44:26 PM 
12/13/2016 3:45:26 PM 
12/13/2016 3:46:26 PM 
12/13/2016 3:47:26 PM 
12/13/2016 3:48:26 PM 
12/13/2016 3:49:26 PM 
12/13/2016 3:50:26 PM 
12/13/2016 3:51:26 PM 

Wie man bemerken kann, nimmt das Intervall allmählich zu. Das Problem tritt auf, wenn Tage verbrauchen. Somit entsteht so etwas wie ich innerhalb der Minute verarbeiten muss und das Datum wird geändert.

Der Code ist einfach

System.Timers.Timer timer = new System.Timers.Timer(); 
timer.Interval = 60000; 
timer.Elapsed += timer_Elapsed; 
timer.Start(); 
+2

Wie nimmt es allmählich zu? Ich sehe Intervalle zwischen '59.?' Und '60.?' Ohne erkennbaren Trend. Windows ist kein Echtzeit-Betriebssystem, daher werden die Timer-Intervalle nie genau sein. – InBetween

Antwort

0

Ich konnte dieses Problem beheben. Die Lösung ist einfach wie

Setzen Sie zwei Überprüfungen auf globaler Ebene;

static bool _IsDirty = false, _TimerChecked = true; 

behandeln dann die Logik innerhalb des ElapsedEventHandler wie lassen DataSynchronizer die Methode delegieren dann könnte Implementierung

private Task AdwordsPullDataSynchronizer(System.Timers.Timer timer) 
{ 

    if (!_TimerChecked) 
    { 
      _IsDirty = false; 
      timer.Stop(); 
      var interval = Convert.ToDouble(Math.Abs(DateTime.Now.Second - 60)); 
      timer.Interval = (interval + 2) * 1000; 
      timer.Start(); 
      _TimerChecked = true; 
    } 

    if (DateTime.Now.Second > 10) 
    { 
     _IsDirty = true; 
     _TimerChecked = false; 
    } 


    //Place your interval logic here 

    if (_IsDirty) 
    { 
     timer.Stop(); 
     var interval = Convert.ToDouble(Math.Abs(DateTime.Now.Second - 60)); 
     timer.Interval = (interval + 2) * 1000; 
     timer.Start(); 
    } 

    return Task.FromResult(0); 
} 

ziemlich klar speichern Seite Logik als

sein i umgesetzt haben.

Was macht der Code? Es wird geprüft, ob das Intervall Sekunden größer als 10 ist, dann wird es reset the timer und das Intervall auf nächste ElapsedEvent 2nd second setzen. Dann wird es zurückgesetzt und fixed the interval zu jedem ElapsedEvent 2nd second.

1

System.Timers.Timer nicht so präzise ist. Überprüfen Sie den Abschnitt mit den Anmerkungen here.

+0

Yup das ist das Problem, für mich jetzt mehr Sorge ist, wie dieses Problem zu behandeln ist –

+0

Ich habe dies nicht selbst implementiert, aber Sie können die Medien hochpräzise Timer verwenden möchten. Hier finden Sie eine Wrapper-Implementierung in C#: http://web.archive.org/web/20110910100053/http://www.indigo79.net/archives/27 – Nick

Verwandte Themen