Minuterie C# qui se déclenche toutes les X secondes, mais reste synchronisée avec le temps réel (c'est-à-diresans dérive)

StackOverflow https://stackoverflow.com/questions/3296784

  •  18-09-2020
  •  | 
  •  

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 ?

Était-ce utile?

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();
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top