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 :

Invoke dans un service ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Par défaut Invoke dans un service ?
    Bonjour à tous,

    J'ai une application fenêtrée (qui hérite donc de System.Windows.Forms.Form) qui utilise des timers de type System.Threading.Timer pour le multi-thread.

    J'aimerais en faire un service. Je dois donc faire hériter ma classe principale de System.ServiceProcess.ServiceBase. Il m'est assez facile de me séparer de mon IHM, sauf pour un point : j'utilise à plusieurs endroits des instructions du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frmMain.Invoke(new stopScanDelegate(this.StopScan));
    Problème : Comment remplacer la méthode Invoke, héritée de System.Windows.Forms.Form ?

    Peut-être existe-t-il d'autres solutions pour transformer mon appli en service, mais celle-ci me semble la plus propre.

    Merci !

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    En WinForms, l'exécution de code dans le thread de l'UI plutôt que dans le thread de travail se justifie : c'est parce qu'on ne peut mettre à jour l'interface que dans le thread de l'UI.

    Dans ton cas : as-tu besoin que la méthode StopScan soit exécutée dans un thread particulier (le thread "principal" de ton service) ? Si c'est pas le cas, tu peux te contenter d'appeler cette méthode directement, plutôt que l'invoquer.

  3. #3
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Par défaut
    Merci pour ta réponse Guulh.
    Malheureusement, j'ai 2 threads qui s'exécutent en plus du thread principal . Comment faire ?

  4. #4
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    Il faut que tu délègue les appels dans ce cas:
    le code à executer doit être dans le thread de l'UI, et l'appel dans tes threads métiers.
    Regarde du côté des delegates.

    http://msdn.microsoft.com/en-us/library/ms173172.aspx

    il doit surement y avoir des tutos sur developpez.com

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par TheOnlyMaX2 Voir le message
    Merci pour ta réponse Guulh.
    Malheureusement, j'ai 2 threads qui s'exécutent en plus du thread principal . Comment faire ?
    Et alors ?

    Comme je disais hier, tu exécutais auparavant la méthode StopScan dans le thread de l'UI. Qu'est ce qui t'empêche aujourd'hui de l'appeler dans le thread métier ? Et donc de remplacer ton Invoke par un simple this.StopScan(); ?

    gdkenny : l'ennui, c'est que de thread de l'UI, bah y'en a plus

  6. #6
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Par défaut
    J'ai trouvé ça :
    http://blogs.msdn.com/bclteam/archiv...15/396428.aspx

    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
    using System.Threading;
    public class CronService : ServiceBase
    { 
      private CronJob job;
      private Timer stateTimer;
      private TimerCallback timerDelegate;
      ...
     
      protected override void OnStart(string [] args)
      {
        job = new CronJob();
        timerDelegate = new TimerCallback(job.DoSomething);
        stateTimer = new Timer(timerDelegate, null, 1000, 1000);
      }
     
      protected override void OnStop()
      {
        stateTimer.Dispose();
      }
      ...
    Donc à priori je peux faire des .Dispose() sur mes 2 timers dans le OnStop().
    Par contre, mes timers sont démarrés une fois, scannent un répertoire, et s'il y a 100 fichiers ils vont traiter les 100 dans une boucle, avant d'en sortir en réactivant le timer 1 seconde plus tard... Du coup, que fait le .Dispose() dans ce cas ? Je teste ça...

    Sinon, une autre solution consiste à séparer le programme en 2 services...

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/10/2006, 04h48
  2. [vb.net] lancer impression dans un service
    Par Invité dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/06/2006, 15h20
  3. Faire un SendMessage dans un service
    Par Lyntern dans le forum C++Builder
    Réponses: 1
    Dernier message: 04/06/2006, 23h07
  4. DLL dans un service
    Par michelci dans le forum Langage
    Réponses: 5
    Dernier message: 05/07/2005, 17h50
  5. Réponses: 2
    Dernier message: 02/08/2004, 17h34

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