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 :

Update progressBar sur thread différent


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 75
    Points
    75
    Par défaut Update progressBar sur thread différent
    Bonjour à tous,

    Voila, j'ai un ti souci et j’espère trouver ma réponse ici ^^
    Le contexte :
    J'ai une app qui fait appel à un service Windows pour effectuer un scan de fichier (récursif). Cette action effectuée par le service renvoie un callback au client de manière désynchronisée pour indiquer l'avancement de la tache sur un progressBar. Le callback est donc traité par le client sur un thread séparé automatiquement.

    Je sais qu'il faut travailler avec les methodes invoke, begininvoke... mais sans résultats, le progressBar n'avance pas.

    Voici le ti bout de code que j'ai pour faire ca :
    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
     
            public void UpdateProgressBar(int value)
            {
     
                if (progressBar1.InvokeRequired)
                {
                    progressBar1.BeginInvoke(new Action(() => UpdateProgressBarValue(value)), value);
                }
                else
                {
                    UpdateProgressBarValue(value);
                }
            }
     
            public void UpdateProgressBarValue(int value)
            {
                progressBar1.Value = value;
            }
    J'ai regardé aussi du coté de la classe SynchronizationContext avec les méthodes Post() et Send() mais sans succès non plus

    Auriez vous une idée car la je sèche...
    Pensez à utiliser les boutons et

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    J'imagine que tu as bien checké que le paramètre "value" contenait bien les valeurs escomptées ?

    Comment lances tu le scan ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 75
    Points
    75
    Par défaut
    oui la valeur de value s’incrémente bien, pas de problème de ce coté

    Pour ce qui est de l'appel au service je fais juste ça sur le main thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<FileInfo> files = monServiceWindows.ScanPath(path);
    Pensez à utiliser les boutons et

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Dans ce cas il faut lancer le scan en arrière plan sinon tu bloques le thread UI et tu freezes l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Task.Run(() => List<FileInfo> files = monServiceWindows.ScanPath(path));
    Tu as échappé au pire : si tu remplaces BeginInvoke par Invoke tu risques d'avoir une surprise.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 75
    Points
    75
    Par défaut
    J'ai bien pensé a cette solution mais bloquer le main thread est logique quelque part puisque le traitement va continuer avec le résultat de la liste obtenue.
    Donc si je fais comme tu dis, je devrais boucler avec while pour attendre que la tache soit terminée.

    Et ca ne peut pas fonctionner puisque le callback du service se fera toujours sur un thread différent du main

    L'utilisation de Invoke en effet ne fonctionne pas, mais ne bloque pas l'application car la communication ac le service recupère un timout donc exception ds l'app.
    Pensez à utiliser les boutons et

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Tu ne dois surtout pas bloquer le thread principal puisque c'est lui qui est responsable de rafraîchir l'UI donc si tu le bloques il ne pourra pas faire son job et t'afficher la progression.
    Donc si ta méthode ScanPath est bloquante tu dois l'exécuter sur un autre thread, une abstraction simple pour ça étant Task.Run.

    Une fois les données récupérées tu mets à jour l'UI, quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Task.Run(() =>
    {
        List<FileInfo> files = monServiceWindows.ScanPath(path);
     
        form.Invoke(() => DisplayFiles(files));
    });
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 75
    Points
    75
    Par défaut
    Bon nickel ça fonctionne...
    Donc voila ce que j'ai fait du coup :

    du coté de l'appel client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     _asyncResult =  Task.Factory.StartNew(() => _files = pipe.ScanPath(chemin).ToList());


    du coté client callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            public void UpdateProgressBar()
            {
                if (progressBar1.InvokeRequired)
                {
                    progressBar1.BeginInvoke(new Action(() => this.progressBar1.PerformStep()));
                }
                else
                {
                    this.progressBar1.PerformStep();
                }
            }
    Merci bien en tout cas pour l'aide
    Pensez à utiliser les boutons et

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

Discussions similaires

  1. progressbar sur thread
    Par bakman dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/08/2011, 11h28
  2. [Débutant] Les opcodes sur les différents processeurs
    Par loverdose dans le forum Assembleur
    Réponses: 11
    Dernier message: 03/02/2005, 13h32
  3. [HTML][débutante] Map ou Onclick sur image ? Différent ?
    Par khany dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 08/12/2004, 14h05
  4. faire un group by sur les différents niveau de code
    Par speed034 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/10/2004, 16h10
  5. Réponses: 2
    Dernier message: 29/09/2004, 09h07

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