.NET, événement chaque minute (à la minute). Est une minuterie la meilleure option?
Je veux faire des trucs à chaque minute (près de l'horloge) dans une application windows forms à l'aide de c#. Je me demande juste quelle est la meilleure façon d'aller à ce sujet ?
Je pouvais utiliser une minuterie et réglez son intervalle de 60000, mais pour le faire fonctionner, sur la minute, je serais obligé de l'activer sur la minute précisément, pas vraiment viable.
Je pouvais utiliser une minuterie et réglez son intervalle de 1000. Puis à l'intérieur de son événement tick, j'ai pu vérifier les horloges minute en cours à l'encontre d'une variable que j'ai mis, si la minute a changé alors exécuter mon code. Cela m'inquiète parce que je fais mon ordinateur faire une vérification de toutes les 1 seconde afin de réaliser toutes les 1 minutes. Sûrement, c'est laid ?
Je suis en utilisant des formes de windows et .Net 2.0, ce ne souhaitez pas utiliser le DispatchTimer qui vient avec .Net 3.5
Ce doit être un problème assez courant. N'avez-vous une meilleure façon de le faire?
- Avez-vous jamais trouver une solution élégante à ce? Je suis confronté à un problème similaire où je veux mettre à jour une horloge sur une application WPF.
Vous devez vous connecter pour publier un commentaire.
Bâtiment sur la réponse de thomas d'aquin, qui peuvent se déplacer et qui ne la cochez pas exactement à la minute dans la seconde de la minute:
Sur ma boîte ce code tiques de façon cohérente .02 de chaque minute:
return ((now.Second > 30 ? 120 : 60) - now.Second) * 1000 - now.Millisecond;
(Next-DateTime.Now).TotalMilliseconds
. Juste mes deux cents 🙂 Merci en tout cas ce thread m'a beaucoup aidé.Comment sur:
La création d'un
Timer
de contrôle qui se déclenche toutes les 1 seconde (et n'a généralement rien mais une simple vérification) permettra d'ajouter négligeable surcharge à votre application.Il suffit de comparer la valeur de
de l'Environnement.TickCount
ouDateTime.Maintenant
à la dernière stockées temps (la dernière minute cochez la case"), et vous devriez avoir une assez précise de la solution. La résolution de ces deux valeurs de temps est d'environ 15ms, qui doit être suffisant pour vos besoins.Faire, toutefois, de noter que l'intervalle de la
Timer
de contrôle est pas garanti pour être précise ou même n'importe où maintenant, car il fonctionne sur Windows boucle de message, qui est lié à la réactivité de l'INTERFACE utilisateur. Ne jamais compter sur elle, même modérément moment précis - même si il est assez bon pour un tir de répétition des événements où vous pouvez vérifier le temps à l'aide d'un méthode plus sensible comme l'un des deux ci-dessus.Vous pouvez obtenir cela avec reactive extensions, qui prendra soin de beaucoup de minuterie problèmes connexes pour vous (modifications de l'horloge, app hibernation etc). L'utilisation de package Nuget Rx-Principal et le code comme ceci:
Lire ici (de la recherche pour "l'Introduction de ISchedulerPeriodic") pour voir toutes les questions c'est en prenant soin de: http://blogs.msdn.com/b/rxteam/archive/2012/06/20/reactive-extensions-v2-0-release-candidate-available-now.aspx
J'ai juste écrit cette classe à l'aide de la WPF DispatcherTimer mais vous pouvez changer le répartiteur de toute minuterie qui prend en charge la modification quand il est réveillé du sommeil à l'état.
La classe est construit avec un fixe pas de temps et supprts Start/Stop/Reset, Start/Stop/Start fonctionne comme un résumé de l'opération. La minuterie est comme un chronomètre à cet égard.
Une horloge de mise en œuvre serait tout simplement de créer la classe avec un intervalle de 1 seconde et écouter l'événement. Méfiez-vous cependant que c'est une horloge en temps réel, si l'événement tick prend plus de temps que l'intervalle pour finir, vous remarquerez que l'horloge va essayer de se rattraper en temps réel ce sera la cause d'une rafale de cocher les événements qui se posent.
Créer une méthode ou mettre ce code où vous souhaitez que la minuterie pour commencer:
Puis sur votre événement tick définir l'intervalle de 60000:
Un peu de code pour voir si la minute qui a changé une fois par seconde ne devrait pas exiger beaucoup de temps CPU, et devrait être acceptable.
Ce sujet Quartz.NET? Je pense que c'est un bon cadre pour faire chronométré actions.
En faisant usage de ReactiveExtensions vous pouvez utiliser le code suivant si vous étiez intéressé à faire quelque chose d'aussi simple que l'impression à la console.
Vous pourriez mettre en place deux minuteries. Un premier court intervalle de minuterie (peut-être sur le feu chaque seconde, mais dépend de la façon dont presice la deuxième timer doit le feu sur la minute).
Vous feu le court intervalle de minuterie seulement jusqu'à l'heure de démarrage souhaitée du principal de la minuterie par intervalles est atteint. Une fois le temps initial est atteint, le second intervalle de minuterie peut être activé, et le court intervalle de minuterie peut être désactivée.
Alternativement, vous pouvez dormir à suspendre l'exécution jusqu'à l'expiration du délai qui devrait être proche de votre temps désiré. Cela ne fera que réveiller l'ordinateur lorsque le sommeil finitions de sorte qu'il vous permettra de gagner du temps CPU et de laisser la puissance du PROCESSEUR vers le bas entre le traitement des événements.
Cela a l'avantage de modifier le délai d'attente afin qu'il ne dérive pas.
Utiliser un minuteur réglé pour fonctionner à chaque seconde (ou de la milliseconde, quelle que soit la précision de votre seuil de l'est), puis le code de la méthode à exécuter la fonctionnalité de votre si et seulement si l'heure est à l'intérieur de ce seuil passé, le "à la minute" point.
Ce que j'utilise pour les tâches planifiées est un Système.Le filetage.Minuterie(Système D'.Le filetage.TimerCallback, objet, int, int) avec le rappel pour le code je veux exécuter en fonction d'un intervalle qui est fourni en millisecondes pour la période valeur.
Ce sujet d'une combinaison de thomas d'aquin " réponse et 'interrogation': (toutes mes excuses pour le mélange de langues)