C# Minuterie ou d'un Thread.Le sommeil
Je suis en cours d'exécution d'un service windows et à l'aide d'une boucle et d'un Filetage.Le sommeil de répéter une tâche, il serait mieux d'utiliser une méthode de minuteur?
Si oui un exemple de code serait génial
Je suis actuellement en utilisant ce code à répéter
int curMinute;
int lastMinute = DateTime.Now.AddMinutes(-1).Minute;
while (condition)
{
curMinute = DateTime.Now.Minute;
if (lastMinute < curMinute) {
//do your once-per-minute code here
lastMinute = curMinute;
}
Thread.Sleep(50000); //sleeps for 50 seconds
if (error condition that would break you out of this) {
break; //leaves looping structure
}
}
Vous devez vous connecter pour publier un commentaire.
Le code pourrait ressembler à quelque chose comme un au-dessus de
Un timer est une meilleure idée, de l'OMI. De cette façon, si votre service est demandé d'arrêter, il peut répondre que très rapidement, et tout simplement pas appeler le timer tick gestionnaire de nouveau... si vous dormez, le gestionnaire de services devront attendre 50 secondes ou tuer votre fils, ni de ce qui est terriblement agréable.
Il est important de comprendre que votre code de sommeil pour les 50 secondes entre la fin d'une boucle, et de commencer le suivant...
Une minuterie d'appel de votre boucle toutes les 50 secondes, ce qui n'est pas exactement le même.
Ils sont tous les deux valides, mais une minuterie est probablement ce que vous cherchez ici.
Méfiez-vous que l'appel à Sleep() le gel, le service, donc si le service est demandé de s'arrêter, de ne pas réagir pour la durée du Sommeil (appeler).
Oui, à l'aide d'une Minuterie permettra de libérer un Thread qui est en train de passer la plupart de son temps à dormir. Une Minuterie aussi avec plus de précision le feu chaque minute, de sorte que vous n'aurez probablement pas besoin de garder une trace de
lastMinute
plus.Pas tout à fait répondre à la question, mais plutôt que d'avoir
Vous devriez probablement avoir
Aussi, j'irais avec un
Timer
.J'ai utilisé les deux minuteries et du Fil.Sommeil(x), ou bien, selon la situation.
Si j'ai un petit bout de code qui doit être exécuté repeadedly, j'ai probablement utiliser une minuterie.
Si j'ai un morceau de code qui peut prendre plus de temps que le délai de la minuterie (comme la récupération de fichiers à partir d'un serveur distant via FTP, où je n'ai pas de contrôle ou de connaître le réseau de retard ou de taille de fichier /temps), je vais attendre pour une période fixe de temps entre les cycles.
Les deux sont valables, mais comme souligné plus haut, ils font des choses différentes. Le minuteur s'exécute votre code toutes les x millisecondes, même si l'instance précédente n'a pas fini. Le Fil.Sommeil(x) attend pour une période de temps après la fin de chaque itération, de sorte que le total de retard par boucle sera toujours plus (peut-être pas de beaucoup) que la période de sommeil.
- Je un fil de feu une fois toutes les minutes (voir la question ici) et j'ai maintenant une
DispatchTimer
sur la base des réponses que j'ai reçues.Les réponses fournir quelques références qui peuvent vous être utiles.
Je suis aussi d'accord, à l'aide d'une minuterie est la meilleure option. J'ai essayé une solution similaire à la vôtre dans le passé et a commencé à avoir des problèmes où la boucle est raté, et j'aurais à attendre pour un autre Thread.Sleep() avant de le feu encore une fois. Aussi, il ne causer toutes sortes de problèmes avec l'arrêt du service, je voudrais obtenir des erreurs constantes sur la façon dont il ne répondait pas et a dû être fermé.
@Prashanth du code doit être exactement ce dont vous avez besoin.
Vous pouvez utiliser l'un des deux. Mais je pense que
Sleep()
est facile, claire et courte à mettre en œuvre.Je dois dire que le sommeil est une meilleure mise en œuvre avec une machine d'état derrière elle. Ce serait encore vous garder le contrôle de l'application à tout moment, mais permettant tout de réponse nécessaire à un moment spécifique. Ce sera également la poignée rappels de la minuterie qui sont plus courts que le "Traitement temps d'exécution dans la boucle"
Par exemple..
Sleep
mise en œuvre, qui vous améliorer. Il n'est même pas un problème dans unTimer
en fonction de la solution; vous n'avez pas de définir un intervalle d'attente, vous pouvez définir un intervalle de tirs de l'événement, de sorte qu'aucun de cette entreprise de déterminer combien de temps d'attente doit être fait à tous.