101 votes

Comment appeler une méthode quotidiennement, à une heure précise, en C# ?

J'ai cherché sur SO et trouvé des réponses sur Quartz.net. Mais il semble être trop gros pour mon projet. Je veux une solution équivalente, mais plus simple et (au mieux) in-code (pas de bibliothèque externe requise). Comment puis-je appeler une méthode quotidiennement, à un moment précis ?

Je dois ajouter quelques informations à ce sujet :

  • la façon la plus simple (et la plus moche) de faire cela est de vérifier l'heure toutes les secondes/minutes et d'appeler la méthode au bon moment.

Je veux un moyen plus efficace de le faire, sans avoir à vérifier l'heure constamment, et en ayant le contrôle sur la réalisation ou non du travail. Si la méthode échoue (à cause d'un problème quelconque), le programme doit savoir qu'il faut écrire dans le journal ou envoyer un courriel. C'est pourquoi j'ai besoin d'appeler une méthode, et non de planifier un travail.

J'ai trouvé cette solution Appeler une méthode à un moment précis en Java en Java. Existe-t-il une méthode similaire en C# ?

EDIT : Je l'ai fait. J'ai ajouté un paramètre dans void Main(), et créé une bat (planifiée par le planificateur de tâches de Windows) pour exécuter le programme avec ce paramètre. Le programme s'exécute, effectue le travail, puis se termine. Si une tâche échoue, il est capable d'écrire un journal et d'envoyer un courriel. Cette approche correspond bien à mes besoins :)

2 votes

Cette question semble indiquer qu'une méthode de votre application en cours doit être appelée périodiquement. Est-ce bien le cas ? Cela aura un impact sur la nécessité d'une planification en cours d'exécution ou sur la possibilité d'utiliser le planificateur de Windows.

0 votes

Mon programme fonctionnera, comme prévu, en continu

0 votes

Hé, je n'arrive pas à croire que tu aies traité ma réponse de "moche". Ce sont des mots de combat :-)

94voto

marc_s Points 321990
  • Créer une application console qui fait ce que vous cherchez
  • Utilisez les fenêtres " Tâches planifiées "pour que l'application de la console soit exécutée au moment où vous en avez besoin.

C'est vraiment tout ce dont vous avez besoin !

Mise à jour : si vous voulez faire cela dans votre application, vous avez plusieurs options :

  • dans un Formulaires Windows vous pourriez exploiter le Application.Idle et vérifiez si vous avez atteint le moment de la journée où vous pouvez appeler votre méthode. Cette méthode n'est appelée que lorsque votre application n'est pas occupée par d'autres choses. Une vérification rapide pour voir si votre heure cible a été atteinte ne devrait pas causer trop de stress à votre application, je pense...
  • dans une application Web ASP.NET, il existe des méthodes permettant de "simuler" l'envoi d'événements programmés. Article de CodeProject
  • et, bien sûr, vous pouvez aussi simplement "déployer votre propre application" dans n'importe quelle application .NET. Article de CodeProject pour un exemple de mise en œuvre

Mise à jour n°2 : si vous voulez vérifier toutes les 60 minutes, vous pouvez créer un minuteur qui se réveille toutes les 60 minutes et si le temps est écoulé, il appelle la méthode.

Quelque chose comme ça :

using System.Timers;

const double interval60Minutes = 60 * 60 * 1000; // milliseconds to one hour

Timer checkForTime = new Timer(interval60Minutes);
checkForTime.Elapsed += new ElapsedEventHandler(checkForTime_Elapsed);
checkForTime.Enabled = true;

et ensuite dans votre gestionnaire d'événement :

void checkForTime_Elapsed(object sender, ElapsedEventArgs e)
{
    if (timeIsReady())
    {
       SendEmail();
    }
}

0 votes

J'y ai déjà pensé :). Mais mon programme fonctionnera en continu, et je veux connaître une autre solution, si elle existe :)

0 votes

C'est une application Winform. Je vais essayer de convaincre mon patron de changer le design, mais je dois d'abord essayer de répondre à ses exigences :p

0 votes

Je vous remercie pour votre réponse. J'ai ajouté quelques informations. J'apprécie beaucoup si vous pouvez m'aider...

9voto

Maxim Zaslavsky Points 6873

Chaque fois que je crée des applications qui nécessitent une telle fonctionnalité, je toujours utiliser le planificateur de tâches de Windows grâce à une simple bibliothèque .NET que j'ai trouvé.

S'il vous plaît voir ma réponse à une question similaire pour obtenir des exemples de code et des explications supplémentaires.

1 votes

Cette bibliothèque n'est disponible que pour le système d'exploitation Windows. Si vous devez l'exécuter sous Linux ou un autre système d'exploitation, veuillez ne pas l'utiliser dans votre projet .NET Core.

8voto

Courtney D Points 1567

Comme d'autres l'ont dit, vous pouvez utiliser une application de console qui s'exécute lorsqu'elle est programmée. Ce que les autres n'ont pas dit, c'est que cette application peut déclencher un EventWaitHandle de processus croisé que vous attendez dans votre application principale.

Console App :

class Program
{
    static void Main(string[] args)
    {
        EventWaitHandle handle = 
            new EventWaitHandle(true, EventResetMode.ManualReset, "GoodMutexName");
        handle.Set();
    }
}

Application principale :

private void Form1_Load(object sender, EventArgs e)
{
    // Background thread, will die with application
    ThreadPool.QueueUserWorkItem((dumby) => EmailWait());
}

private void EmailWait()
{
    EventWaitHandle handle = 
        new EventWaitHandle(false, EventResetMode.ManualReset, "GoodMutexName");

    while (true)
    {
        handle.WaitOne();

        SendEmail();

        handle.Reset();
    }
}

4voto

Pieter Germishuys Points 3482

La meilleure méthode que je connaisse, et probablement la 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 de faire en sorte que votre application fonctionne en permanence et vérifie un moment particulier de la journée ou encore d'écrire un service Windows qui fait la même chose.

4voto

mansoor Points 21

Je sais que c'est vieux, mais que pensez-vous de ça ?

Construire une minuterie à déclencher au démarrage qui calcule le temps jusqu'à la prochaine exécution. Au premier appel du runtime, annulez la première minuterie et lancez une nouvelle minuterie quotidienne. Changez la périodicité quotidienne en horaire ou en toute autre périodicité que vous souhaitez.

13 votes

Et regardez-le échouer pendant les changements d'heure d'été .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X