Comment appeler une méthode au quotidien, au moment précis, en C#?
J'ai cherché sur DONC et trouvé des réponses sur Quartz.net. Mais il semble trop grande pour mon projet. Je veux une solution équivalente, mais plus simple et (au mieux) dans le code (pas de bibliothèque externe nécessaire). Comment puis-je appeler une méthode au quotidien, à un moment précis?
J'ai besoin d'ajouter des informations à ce sujet:
- le plus simple (et laid) façon de le faire est de vérifier le temps à chaque seconde/minute, et l'appel à la méthode, au bon moment
Je veux un plus efficace pour ce faire, pas besoin de vérifier les temps, et j'ai le contrôle de savoir si le travail est fait un pas. Si la méthode n'est pas (à cause de tous les problèmes), le programme doit savoir écrire pour le journal/envoyer un e-mail. C'est pourquoi j'ai besoin d'appeler une méthode, pas un travail.
J'ai trouvé cette solution Appeler une méthode à heure fixe en Java en Java. Est-il une manière similaire en C#?
EDIT: j'ai fait cette. J'ai ajouté un paramètre dans l'void main(), et a créé une chauve-souris (prévue par le Planificateur de Tâches de Windows) pour exécuter le programme avec ce paramètre. Le programme s'exécute, fait le boulot, et puis quitte. Si une tâche échoue, il est capable d'écrire de journal et envoyer des courriels. Cette approche correspond à mes besoins 🙂
- Qui reliait question semble indiquer qu'une méthode au sein de votre application en cours d'exécution doit être appelée périodiquement. Est-ce le cas? Il aura un impact si vous avez besoin d'ordonnancement des processus, ou si vous pouvez simplement utiliser le planificateur de tâches Windows.
- mon programme, car les exigences, fonctionner en continu
- Hey, je ne peux pas croire que vous avez appelé ma réponse "laid". Eux de se battre mots 🙂
- Ne pas dire à propos de votre réponse :p. J'y ai pensé, trop, et j'ai trouvé le mien laid.
- Associée à stackoverflow.com/questions/725917
Vous devez vous connecter pour publier un commentaire.
C'est vraiment tout ce dont vous avez besoin!
Mise à jour: si vous voulez le faire à l'intérieur de votre application, vous avez plusieurs options:
Application.Idle
événement et vérifier pour voir si vous avez atteint le temps dans la journée pour appeler votre méthode. Cette méthode n'est appelée que lorsque votre application n'est pas occupé avec d'autres choses. Une vérification rapide pour voir si votre cible a été atteinte ne faut pas mettre trop de stress sur votre application, je pense...Mise à jour #2: si vous voulez vérifier toutes les 60 minutes, vous pouvez créer un timer qui se réveille toutes les 60 minutes et si le temps est écoulé, il appelle la méthode.
Quelque chose comme ceci:
et puis dans votre gestionnaire d'événement:
timeIsReady()
appel faire?Chaque fois que je créer des applications qui nécessitent une telle fonctionnalité, je toujours utiliser le Planificateur de Tâches de Windows par le biais d'un simple .NET-library que j'ai trouvé.
Veuillez voir ma réponse à une question similaire pour un exemple de code et de plus amples explications.
Comme d'autres l'ont dit, vous pouvez utiliser une console application à exécuter lors de la planification. Ce que les autres n'ont pas dit, c'est que vous pouvez cette application déclencher un processus croisé EventWaitHandle qui vous attendent dans votre application principale.
Application Console:
Application Principale:
J'ai créé un simple programmateur qui est facile à utiliser et vous n'avez pas besoin d'utiliser une bibliothèque externe. TaskScheduler est un singleton qui conserve une référence sur les compteurs à zéro, de sorte minuteries ne seront pas nettoyés, il peut programmer plusieurs tâches. Vous pouvez définir le premier run (heure et minute), si, au moment de la planification de ce temps, c'est sur la planification des le départ de la prochaine journée de cette époque. Mais il est facile de personnaliser le code.
De la planification d'une nouvelle tâche est si simple. Exemple: À 11:52 la première tâche pour chaque 15 secunds, le deuxième exemple est pour tous les 5 secunds. Pour une exécution quotidienne sur 24 au 3 paramètre.
Ma fenêtre de débogage:
Il suffit d'ajouter cette classe à votre projet:
La meilleure méthode que je connais et probablement le plus simple est d'utiliser le Planificateur de Tâches de Windows pour exécuter votre code à un moment précis de la journée ou avez-vous l'exécution de l'application en permanence et vérifier un moment particulier de la journée ou de rédiger un service windows qui en fait de même.
Je sais c'est vieux mais comment à ce sujet:
Construire une minuterie à feu au démarrage qui calcule le temps de temps d'exécution suivant. Lors de la première convocation de l'exécution, d'annuler la minuterie d'abord et de commencer une nouvelle quotidienne de la minuterie. changer tous les jours à l'heure ou ce que vous voulez de la périodicité de l'être.
Si vous voulez un exécutable à exécuter, utiliser les Tâches Planifiées de Windows. Je vais supposer (peut-être à tort) que vous voulez une méthode à exécuter dans votre programme actuel.
Pourquoi ne pas simplement avoir un thread en cours d'exécution en continu le stockage de la dernière date à laquelle la méthode a été appelée?
L'avoir réveiller toutes les minutes (par exemple) et, si l'heure actuelle est plus grande que le temps spécifié et la dernière date enregistrée n'est pas la date du jour, l'appel à la méthode, puis mise à jour de la date.
C'est peut être juste moi, mais il semble que la plupart de ces réponses n'étaient pas complètes ou ne fonctionnerait pas correctement. J'ai fait quelque chose de très rapide et sale. Cela étant dit, vous ne savez pas comment bien d'une idée c'est de faire de cette façon, mais il fonctionne parfaitement à chaque fois.
Récemment, j'ai écrit une application en c# qui avait pour redémarrer tous les jours. Je me rends compte que cette question est vieux, mais je ne pense pas que ça fait mal d'en ajouter une autre solution possible. C'est de cette façon que j'ai manipulé quotidiennement redémarre à une heure spécifiée.
Pour assurer votre minuterie est conservé dans le champ d'application je vous recommande de créer en dehors de la méthode à l'aide de
System.Timers.Timer tmrRestart = new System.Timers.Timer()
méthode. Mettre la méthodeRestartApp()
dans votre événement load du formulaire. Au lancement de l'application il permettra de définir les valeurs pourAppRestart
sicurrent
est plus grand que le redémarrage fois que nous ajoutons 1 jour àAppRestart
pour assurer le redémarrage se produit dans les temps et que nous n'avons pas une exception pour mettre une valeur négative dans la minuterie. Dans letmrRestart_Elapsed
événement exécuter n'importe quel code vous avez besoin couru à ce moment précis. Si votre application redémarre tout seul, vous n'avez pas nécessairement à l'arrêt de la minuterie, mais il ne fait pas de mal non plus, Si l'application n'a pas redémarrer, il suffit d'appeler laRestartApp()
méthode de nouveau et vous serez bon d'aller.Voici une façon de le faire à l'aide de TPL. Pas besoin de créer, de disposer d'un timer, etc:
Plutôt que de fixer un temps pour s'exécuter à chaque seconde de toutes les 60 minutes, vous pouvez calculer le temps restant et réglez la minuterie à la moitié (ou fraction) de cette. De cette façon, votre pas de vérifier le temps, comme beaucoup, mais aussi maintianing un degré de accurcy que le minuteur d'intervalle réduit, plus vous vous rapprochez de votre objectif de temps.
Par exemple, si vous vouliez faire quelque chose de 60 minutes à partir de maintenant les minuteurs d'intervalles seraient aproximatly:
30:00:00, 15:00:00, 07:30:00, 03:45:00, ... , 00:00:01, RUN!
J'utilise le code ci-dessous pour redémarrer automatiquement un service une fois par jour. J'utilise un thread parce que j'ai trouvé des minuteries pour être peu fiable sur de longues périodes, alors que c'est plus cher dans cet exemple, il est le seul à créé à cet effet donc, ce dosn a pas d'importance.
(Converti à partir VB.NET)
...
Remarque, j'ai mis un faibles intervalle de 1000 ms, ce qui pourrait être increaded, réduite ou supprimée en fonction de la accurcy vous avez besoin.
N'oubliez pas aussi d'arrêter votre thread/minuterie lorsque votre application se ferme.
J'ai une approche très simple. Cela crée une 1 minute de temps avant que l'action se passe. Vous pouvez ajouter des secondes aussi bien pour faire le Fil.Sleep(); plus courte.
24 heures de temps de
J'ai trouvé cela très utile: