Je veux déclencher des killzombies tous les soirs à minuit. Le problème que j'ai, c'est que le premier intervalle de minuterie est conservé et non réinitialisé à 86400 000 millisecondes, car j'essaie de faire dans ma méthode.
Y a-t-il un moyen de supprimer l'ancien intervalle et de le remplacer par un nouveau? p>
4 Réponses :
essayer appelant stop () code> d'abord, puis
start () code> à nouveau. p>
Après la ligne: Timer.Interval = 86400000; ?
Stop code> Avant,
Démarrer code> après.
Pouvez-vous expliquer ce qui se passe lorsque la minuterie s'arrête lorsque l'intervalle se réinitialise par opposition à la maintenance de la minuterie lors de la réinitialisation de l'intervalle?
Je pensais la même chose que toi (évidemment, par ma réponse), mais quand je cherchais une explication quant à la raison pour laquelle cela fonctionnerait à l'aide de réflecteur, j'ai constaté que les deux méthodes devraient fonctionner de manière égale. Est-ce que je manque quelque chose d'évident?
hmmmm ... semble être un problème de planification pour moi.
Pourquoi pas quelque chose d'un peu plus adapté à la planification des tâches telles que Quartz.net ? De cette façon, vous n'avez pas à vous soucier de définir une minuterie à courir à minuit, puis de la modifier plus tard. P>
Si vous êtes vraiment opposé à un cadre de planification, vous pouvez essayer: P> < Pré> xxx pré> p>
Pour mon projet actuel, j'ai besoin de ma méthode de zombies de kill pour travailler. Il n'y a pas d'autres tâches programmées que je dois courir, alors l'utilisation d'un cadre semble être un peu trop excédentaire pour obtenir un travail. Je pourrais avoir tort, mais en ce moment, j'ai juste besoin de faire fonctionner cette chose. Je garderai à l'esprit du quartz pour tout futur de projets nécessitant des tâches de planification intensives (qui est en fait assez probable).
au lieu d'utiliser un tel intervalle, je voudrais plutôt utiliser un intervalle d'une seconde (ou une minute) et vérifier datetime.now code> et s'il a atteint la valeur souhaitée, commencez le travail.
System.Timers.Timer Timer = new System.Timers.Timer();
Timer.Elapsed += new ElapsedEventHandler(KillZombies);
Timer.Interval = 60000;
Timer.Start()
private void KillZombies(object source, ElapsedEventArgs e)
{
if((DateTime.Now - DateTime.Today) < new TimeSpan(0, 1, 0))
{
//ToDo: Kill Zombies
}
}
FWIW, lors de l'utilisation de la minuterie, j'ai toujours défini la propriété code> autoréforme code> sur De plus, pour être explicite, j'aurais une fonction qui calcule de millisecondes à minuit à chaque fois et d'assigner que à l'intervalle de la minuterie à chaque fois. Rendrait votre code plus clair. Et aussi, si vous utilisez false code>. Cela empêche la minuterie de démarrer à nouveau, vous devez donc appeler
Timer.Start () code> pour commencer à compter à nouveau. Cela éviterait les appels supplémentaires à
stop () code> p>
Timer.Autherest = false code>, la minuterie ne démarre pas de compter tant que vous appelez
Timer.Start () code>, ce qui signifie si vous mettez le
Démarrer () Code> Appelez à la fin de votre
Méthode Killzombies CODE> et cette méthode prend 5 secondes pour exécuter, votre minuterie devrait alors être
86400000 - 5000 Code>. Que 5 secondes décalage s'ajoutaient au fil du temps. P>
Je voulais juste écrire la même chose :-)
Erreur d'accumulation, jamais même franchi mon esprit. Je changerai le code pour recalculer des millisecondes à minuit à chaque fois. Merci!
Je ne sais pas si cela est correct ou non, mais j'essaierais de l'arrêter, puis réinitialisez l'intervalle, puis redémarrez-le.
@Nicklarsen vous auriez battu la réponse acceptée si vous aviez posé cela comme une réponse au lieu d'un commentaire :-)