Hatte das gleiche Problem, außer dass es ein generisches System war, das dasselbe mit vollständig einstellbaren Intervallen von Millisekunden bis zu Monaten tun konnte. Nun, war angenommen zu. Es stellte sich heraus, dass es in der Tat in Intervallen von mehr als 24,8 Tagen aufgrund dessen versagte.
In meinem Fall war das "Überdenken des Ansatzes" außer Frage, da es nur ein kleines Problem Sub-Fall eines viel größeren Windows-Dienstsystems war.
Die Lösung war ziemlich einfach, aber beachten Sie, dass ich ein Seitensystem hatte, das mich mit der nächsten Ausführung als DateTime
lieferte; Der Job des Zeitgebers bestand nur darin, das zu erreichen, um die Aufgabe tatsächlich auszuführen, also berechnete er das Intervall, indem er einfach DateTime.Now
davon abzog.
In diesem Fall alles, was ich tun musste, war neben meinem Timer-Objekt einen Überlauf boolean zu halten, und Einstellung, dass, wenn dieses Intervall gegen Int32.MaxValue
Überprüfung:
private Timer _timer;
private Boolean _overflow;
private void QueueNextTime(DateTime thisTime)
{
TimeSpan interval = this.GetNextRunTime(thisTime) - DateTime.Now;
Int64 intervalInt = (Int64)((interval.TotalMilliseconds <= 0) ? 1 : interval.TotalMilliseconds);
// If interval greater than Int32.MaxValue, set the boolean to skip the next run. The interval will be topped at Int32.MaxValue.
// The TimerElapsed function will call this function again anyway, so no need to store any information on how much is left.
// It'll just repeat until the overflow status is 'false'.
this._overflow = intervalInt > Int32.MaxValue;
this._timer.Interval = Math.Min(intervalInt, Int32.MaxValue);
this._timer.Start();
}
// The function linked to _timer.Elapsed
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
this._timer.Stop();
if (this._overflow)
{
QueueNextTime(e.SignalTime);
return;
}
// Execute tasks
// ...
// ...
// schedule next execution
QueueNextTime(e.SignalTime);
}
Dies vereinfacht, natürlich; Das reale System hat try/catch und ein System, um externe Stoppbefehle abzubrechen. Aber das ist der Kern davon.
Design neu gedacht, und jetzt überprüft ein Timer eine NextExecuteTime-Eigenschaft. Danke für Ihre Hilfe. –
Ich bin froh, dass ich helfen konnte. –