6
votes

Timer.Interval question

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? xxx


2 commentaires

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 :-)


4 Réponses :


1
votes

essayer appelant stop () d'abord, puis start () à nouveau.


4 commentaires

Après la ligne: Timer.Interval = 86400000; ?


Stop Avant, Démarrer 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?



4
votes

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.

Si vous êtes vraiment opposé à un cadre de planification, vous pouvez essayer: < Pré> xxx


1 commentaires

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).



1
votes

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
    }
}


0 commentaires

9
votes

FWIW, lors de l'utilisation de la minuterie, j'ai toujours défini la propriété autoréforme sur false . Cela empêche la minuterie de démarrer à nouveau, vous devez donc appeler Timer.Start () pour commencer à compter à nouveau. Cela éviterait les appels supplémentaires à stop ()

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 Timer.Autherest = false , la minuterie ne démarre pas de compter tant que vous appelez Timer.Start () , ce qui signifie si vous mettez le Démarrer () Appelez à la fin de votre Méthode Killzombies et cette méthode prend 5 secondes pour exécuter, votre minuterie devrait alors être 86400000 - 5000 . Que 5 secondes décalage s'ajoutaient au fil du temps.


2 commentaires

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!