Minuterie C# qui se déclenche toutes les X secondes, mais reste synchronisée avec le temps réel (c'est-à-diresans dérive)
Question
Existe-t-il un minuteur .NET disponible en C# qui peut garantir qu'il n'y a pas de « dérive » entre les événements ?Autrement dit, si vous réglez la minuterie pour qu'elle se déclenche toutes les X secondes, après des jours de fonctionnement, elle ne dérivera pas, c'est-à-direpour garantir que le nombre d'événements d'approche de X secondes dans une journée reste synchronisé avec ce qu'il devrait être ?
Sinon, existe-t-il un exemple de code bien connu qui envelopperait une fonction Timer en C# pour ce faire ?
La solution
désolé de vous avoir seulement donné un lien vers quartz.net, mais il s'agit d'une entreprise pleinement qualifiée, testée, ...bibliothèque ...vous n'avez pas besoin de réinventer la roue :)
si vous vous inquiétez des frais généraux, quelle est votre définition des frais généraux ?est-ce la taille du fichier (les binaires font environ 0,5 Mo) ou la surcharge dans la logique.bien pour la partie logique :je pense que mettre en œuvre leur IJob
-interface fait du bon travail pour forcer un meilleur code au consommateur.je ne suis pas un grand ami des méthodes en ligne (juste à titre d'exemple, car vous pourriez déclencher leurs pointeurs à l'expiration du temps imparti) - les classes vous donneraient beaucoup plus de possibilités, et encore une fois, forceraient une meilleure conception de domaine, .. .
mais:faire Console.WriteLine(...)
avec quartz.net serait exagéré...:)
Autres conseils
Je suppose que vous avez déjà essayé quelque chose, et que cela dérive.
Si vous voulez que quelque chose se déclenche à chaque 5 secondes à partir de l'heure (5,10,15,20 ..), vous pouvez définir votre minuterie pour tirer une fois, puis dans votre rappel, réinitialiser la minuterie au feu à DateTime.Now + nombre de secondes à l'intervalle de 5 secondes suivant.
Cela empêcherait toute dérive tant que votre horloge est correcte.
quelque chose comme ça
System.Timers.Timer timer = new Timer();
void Init()
{
timer.Elapsed += timer_Elapsed;
int wait = 5 - (DateTime.Now.Second % 5);
timer.Interval = wait*1000;
timer.Start();
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Stop();
int wait = DateTime.Now.Second % 5;
timer.Interval = wait * 1000;
timer.Start();
}