IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lancer méthode à une heure précise (sans planificateur de tâche)


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut Lancer méthode à une heure précise (sans planificateur de tâche)
    Bonjour,

    J'aimerai lancer une méthode, ou même le contenu entier de mon programme à une heure précise.
    Le planificateur de tâche pourrait me permettre cela, mais cela ne fonctionne pas comme je le souhaite (vu dans mon dernier post : http://www.developpez.net/forums/d12...che-planifiee/ )
    Le but n'est pas de consommé de la mémoire à boucler sans cesse pour tomber sur l'heure voulue pour lancer mon programme.
    Existe-t-il une façon simple de lancer le contenu de mon .exe à une heure précise de la journée?

    Merci d'avance...

  2. #2
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Je pense qu'une tâche planifiée est la meilleure manière de procéder.

    Il doit juste y avoir un bug dans ton programme. Essaye de mettre à chaque ligne une fonction de log qui enregistre l'état des variables: Tu auras un truc super verbeux mais au moins tu pourras détecter le problème assez facilement.

    Sinon, même en tâche planifiée, rien ne t'empêche de t'attacher au processus pour débugger je pense.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Merci pour ta réponse,

    Le problème vient en faite du paramètre "Exécuter même si l'utilisateur n'est pas connecté" qui est pour moi indispensable. Lorsque celui-ci est coché, la tâche s'exécute en non-visible ce qui empêche le lancement de mes exécutables appelés avec Process.start().
    Alors que si l'option "N'exécuter que si l'utilisateur est connecté", la tâche s'exécute en visible ce qui lance correctement mes .exe.
    Je suis donc bloqué sur ce point, car selon Google il n'y a pas d'alternative à cette non-visibilité de la tâche...
    La seul semble une boucle qui me fait froid dans le dos!
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
                DateTime now;
                while (true)
                {
                    now = DateTime.Now;
                    if (now.DayOfWeek == DayOfWeek.Monday)
                    {
                        if (now.Hour == 20)
                        {
                            if (now.Minute == 30)
                                break;
                            else
                                Thread.Sleep(30000); //Tout les 30s
                        }
                        else
                            Thread.Sleep(1800000); //Tout les 30min
                    }
                    else
                        Thread.Sleep(21600000); //Tout les 6h
                }
    J'aimerai évité d'insérer ce code mais j'ai l'impression que je n'aurais pas le choix malheureusement...

  4. #4
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Je viens de penser à un truc. Que donne le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TimeSpan triggerTime = new TimeSpan(20, 30, 0); // Starting at 20h30
    DateTime triggerDate = DateTime.Today.Add(triggerTime); // Today's occurence
     
    TimeSpan timeRemainingBeforeTrigger = triggerDate - DateTime.Now;
     
    Timer t = new Timer(timeRemainingBeforeTrigger.TotalMilliseconds);
    t.Start();
    Bon le code est bien pourri mais c'est pour donner l'idée quoi. Lancer un timer avec en param le nombre de milliseconde entre l'heure qu'il est et la prochaine occurence.

    Du coup, une fois dans la callback, tu changes la duration du timer à 24h et tu es peinard

    Je sais pas ce que ça vaut mais c'est peut être une piste à explorer.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Je l'exploiterai demain, mais ca me semble déjà moins lourd que ma boucle
    Merci pour ton aide

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par FrameBreak Voir le message
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (true) 
    { 
        // 
    }

    C'est le genre de truc qu'on voit dans les pires exemples de code

    [EDIT] Ca m'a fait marrer. Mais ceci dit, c'est vrai que ça s'utilise je viens d'en discuter avec des collègues et de faire quelques recherches sur Google, qui confirment, genre ça.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    LOL, oui c'était plus qu'horrible comme début!
    Mais voilà ou j'en suis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
                DateTime now = DateTime.Now;
                now = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
     
                List<DateTime> nextWednesday = new List<DateTime>();
                for (int i=0; i<100; i++)                                  
                {
                    if (now.AddDays(i).DayOfWeek == DayOfWeek.Wednesday)
                        nextWednesday.Add(now.AddDays(i));
                }
     
                foreach (DateTime nextDate in nextWednesday)
                {
                    TimeSpan triggerTime = new TimeSpan(20, 30, 0);
                    DateTime nextWed = nextDate + triggerTime;
                    TimeSpan interval = nextWed - DateTime.Now;
     
                    Console.WriteLine(interval.TotalMilliseconds);
     
                    //System.Timers.Timer t = new System.Timers.Timer(interval.TotalMilliseconds);
                    //t.Start();
                    Thread.Sleep((int)interval.TotalMilliseconds);
                }
    Je remet à zéro l'heure, les minutes et secondes du jour. Suivis du calcul des prochains mercredis (durant les 3 prochains mois) ensuite je calcul l'intervalle entre la date actuelle et les mercredis listés.
    Jusqu'ici tout va bien, mais je me trouve bloqué avec le timer! N'ayant jamais utiliser Timer, je suis un peu perdu car il ne se lance pas
    Je peux le faire avec Thread.Sleep() en arrondissant le nombre de ms, mais laquelle de ces 2 méthodes consomment le moins de ressource?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FrameBreak Voir le message
    Jusqu'ici tout va bien, mais je me trouve bloqué avec le timer! N'ayant jamais utiliser Timer, je suis un peu perdu car il ne se lance pas
    Il y a normalement une méthode Start() qui démarre le Timer et surtout une propriété Interval qui te permet de paramétrer la périodicité.

    Citation Envoyé par FrameBreak Voir le message
    Je peux le faire avec Thread.Sleep() en arrondissant le nombre de ms, mais laquelle de ces 2 méthodes consomment le moins de ressource?
    L'utilisation de Thread.Sleep() pour déclencher une tâche périodique n'est pas... comment dirais-je... élégant. Il faut passer par le Timer ou j'aime bien la librairie Quartz.Net qui te permet de faire ces genres de trucs très facilement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer une application à une heure précise
    Par honnorat dans le forum Android
    Réponses: 5
    Dernier message: 22/10/2013, 14h04
  2. Réponses: 2
    Dernier message: 02/06/2010, 17h06
  3. Réponses: 6
    Dernier message: 17/08/2006, 09h40
  4. Exécuter une action à une heure précise
    Par Rhadamanthe59 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 09/02/2006, 23h12
  5. [PPC][C#] Reveiller un PPC à une heure précise
    Par aeled dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 27/12/2005, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo