Question

Supposons que je dispose d’un événement non récurrent qui doit être déclenché dans un délai tel que le délai d’expiration. Intuitivement, il serait judicieux de créer un System.Timers.Timer, de définir son intervalle sur X * 1000, de relier sa coche à l'événement et de le démarrer. Dans la mesure où il s’agit d’un événement non récurrent et que vous ne souhaitez le déclencher qu’une fois, vous devrez alors arrêter le chronomètre une fois le délai écoulé.

Le fait que les minuteries soient intrinsèquement récurrentes me rend toutefois méfiant si c'est vraiment la meilleure façon de le faire. Serait-il préférable / plus précis / plus sûr de gagner du temps, de régler le minuteur pour qu'il tique toutes les secondes (voire même une milliseconde), puis interroge le système pour obtenir l'heure et déclenche manuellement l'événement cible une fois que le délai requis s'est écoulé?

Quelqu'un peut-il préciser quelle est la meilleure méthode? (peut-être existe-t-il une autre option à laquelle je n'avais pas pensé aussi). Une méthode devient-elle meilleure que l’autre si la période que j’ai besoin d’attendre est mesurée en millisecondes?

Était-ce utile?

La solution

Ce constructeur pour System.Threading.Timer vous permet pour spécifier une période . Si vous définissez ce paramètre sur -1, il désactivera la signalisation périodique et ne sera exécuté qu'une seule fois.

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)

Autres conseils

utilisez simplement une minuterie normale et désactivez-la une fois écoulée. cela devrait résoudre votre problème.

à la fois, system.threading.timer et system.timers.timer le supportent.

Déconnectez un nouveau BackgroundWorker, dormez, fermez.

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();

Vous pouvez utiliser un System.Timers.Timer avec AutoReset = true ou un System.Threading.Timer avec une période infinie (System.Threading.Timeout.Infinite = -1) pour exécuter un chronomètre une fois.

Dans les deux cas, vous devez supprimer votre minuterie une fois que vous avez terminé (dans le gestionnaire d'événements pour un Timers.Timer ou le rappel pour un Threading.Timer) si vous n'avez pas d'intervalle récurrent.

il suffit de le configurer pour cocher après X secondes, et dans le code de la coche, faites:

timer.enabled = false;

a travaillé pour moi.

Si vous souhaitez une mesure précise de l’heure, envisagez de doubler la fréquence de la minuterie et d’utiliser DateTime.Now pour la comparer à votre heure de début. Les minuteries et les threads. Les nuits ne sont pas forcément exactes.

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