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 :

ProgressBar pendant un appel de web Service


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Novembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2016
    Messages : 20
    Points : 13
    Points
    13
    Par défaut ProgressBar pendant un appel de web Service
    Bonjour à toutes et à tous,

    J'ai une nouvelle problématique de Novice en C# :

    je souhaite afficher une barre de progression pendant un appel de web service mais je ne doit pas faire cela comme il faut car ma barre de progression change d'état uniquement à la fin de mon traitement (après un message que j'affiche à l'écran pour dire que la chaîne de connexion est créée).

    je ne veut pas m'amuser à calculer exactement la durée de traitement et faire évoluer la barre en proportion avec le temps de traitement mais juste afficher la barre de progression avec le style Marquee pour donner un aspect de loader. En fait ma progressBar ne réagit que lorsque le traitement est fini alors que le but est que le loader prenne le relais pendant le traitement de l'appel du web service.

    Voici mon code :
    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
    23
    24
     
    if (checkBox3.Checked == true)
    {
    	progressBar4.Visible = true;
    	progressBar4.Style = ProgressBarStyle.Marquee;
    	progressBar4.MarqueeAnimationSpeed = 100;                    
     
    	try
    	{
    	   /* // < !--Appel de Web service -->
    		.
    		..traitement pour appeler un web service 
    		...qui construit chaîne de connexion 
    		....dans une application .NET
    		...... */
    		progressBar4.Style = ProgressBarStyle.Blocks;
    		progressBar4.Value = 100;
    		MessageBox.Show("La chaîne de connexion a été créée avec succès !");
    	}
    	catch (Exception exp)
    	{
    		MessageBox.Show(exp.ToString());
    	}
    }
    D'avance merci pour vos conseils.

    Je viens d'effectuer quelques recherches complémentaires et j'ai trouvé le code suivant mais en VB : je pense que cela correspond à ce que vous m'avez expliqué.
    Merci de m'indiquer si je m'oriente vers la bonne solution :
    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
     
        Private mThread As Thread
        Public Sub DemarrerTraitement(tache As action)
            mThread = New Thread(New ThreadStart(Sub()
                                                     Me.Invoke(Sub(ctrl As Form1) DebutTraitement(ctrl), New Object() {Me})
                                                     tache.Invoke()
                                                     Me.Invoke(Sub(ctrl As Form1) FinTraitement(ctrl), New Object() {Me})
                                                 End Sub
                        ))
            mThread.Start()
     
        End Sub
     
     
        Private Sub DebutTraitement(window As Form1)
            window.Barre(True)
        End Sub
     
        Private Sub FinTraitement(window As Form1)
            window.Barre(False)
        End Sub

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    C'est tout à fait normal comme comportement. Le soucis vient du fait que l'appel au webservice ce fait depuis le thread graphique. Aussi, tant que le webservice n'est pas terminé, le thread graphique n'est pas disponible et ne peut donc mettre à jour les composants (et en l’occurrence, la barre de progression). Pour confirmer cet état de fait, la fenêtre doit tout simplement être gelée durant l'appel.

    La seule chose à faire, pour vous, c'est de rendre l'appel au webservice asynchrone. Il existe plusieurs solutions pour cela (un nouveau Thread, un Task, async/await, etc...). Pour répondre au mieux au problème, il faudrait avoir le code complet de la méthode dans laquelle s'effectue l'appel au webservice.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Novembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2016
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Bonjour François,

    Un grand merci à vous pour cette réponse déjà très précise.

    Je serai ravi d'avoir un peu plus de conseil pour pouvoir avancer sur le sujet, du coup voici mon code :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    private void button2_Click(object sender, EventArgs e)
            {
                if (true)
                {
                    if (checkBox3.Checked == true)
                    {
                        progressBar4.Visible = true;
                        progressBar4.Style = ProgressBarStyle.Marquee;
                        progressBar4.MarqueeAnimationSpeed = 100;                    
     
                        fr.marquetis.hermes.ServiceCallFileManager.ServiceCallFileManager ws_service = new fr.marquetis.hermes.ServiceCallFileManager.ServiceCallFileManager();
                        fr.marquetis.hermes.setconfig.ServiceTools setConfig = new fr.marquetis.hermes.setconfig.ServiceTools();
                        fr.marquetis.hermes.setconfig.Connection Connection = new fr.marquetis.hermes.setconfig.Connection();
                        fr.marquetis.hermes.setconfig.Customer Customer = new fr.marquetis.hermes.setconfig.Customer();
                        fr.marquetis.hermes.getconfig.ReadTools getConfig = new fr.marquetis.hermes.getconfig.ReadTools();
     
                        setConfig.CookieContainer = new System.Net.CookieContainer();
                        setConfig.Url = "http://localhost/hermes_net_v4/admin/web_service/setconfig.asmx";
                        setConfig.LogUser("XXXXXXX");
                        setConfig.Begin();
     
                        // < !--la partie Connection -->
                        Connection.Type = "SQLSERVER";
                        Connection.Login = "sa";
                        Connection.Password = "XXXXXXX";
                        Connection.Base = CampaignName.Text;
                        Connection.Server = "192.168.192.201";
                        Connection.Description = CampaignName.Text;
                        Connection.DatabaseConnection = "Provider=SQLOLEDB.1;User ID=sa;Password=XXXXXX;Initial Catalog=" + CampaignName.Text + ";Data Source=Localhost";
                        Connection.Name = CampaignName.Text;
                        Connection.Valid = true;
     
                        try
                        {
                            ws_service.CreateDatabaseWithConnectionString(Connection.DatabaseConnection, Connection.Type, Connection.Name);
                            Connection = setConfig.AddConnection(Connection);
     
                            MessageBox.Show("La chaîne de connexion " + Connection.Name.ToString() + " a été créée avec succès !");
     
                            setConfig.Commit();                                             
                            setConfig.Disconnect();
                            CampaignName.Text = "";
                        }
                        catch (Exception exp)
                        {
                            MessageBox.Show(exp.ToString());
                        }
                    }
                }
            }
    Je cherche à afficher un loader de la façon la plus simple pendant un appel de web service ou toute autre action/ traitement d'ailleurs.

    D'avance merci pour votre aide.

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    L'idée est celle-ci :
    Code C# : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    private void button2_Click(object sender, EventArgs e)
            {
                if (true)
                {
                    if (checkBox3.Checked == true)
                    {
                        progressBar4.Visible = true;
                        progressBar4.Style = ProgressBarStyle.Marquee;
                        progressBar4.MarqueeAnimationSpeed = 100;                    
    					string compaignName = CompaignName.Text;
     
    					Task.Run(() => {
    						fr.marquetis.hermes.ServiceCallFileManager.ServiceCallFileManager ws_service = new fr.marquetis.hermes.ServiceCallFileManager.ServiceCallFileManager();
    						fr.marquetis.hermes.setconfig.ServiceTools setConfig = new fr.marquetis.hermes.setconfig.ServiceTools();
    						fr.marquetis.hermes.setconfig.Connection Connection = new fr.marquetis.hermes.setconfig.Connection();
    						fr.marquetis.hermes.setconfig.Customer Customer = new fr.marquetis.hermes.setconfig.Customer();
    						fr.marquetis.hermes.getconfig.ReadTools getConfig = new fr.marquetis.hermes.getconfig.ReadTools();
     
    						setConfig.CookieContainer = new System.Net.CookieContainer();
    						setConfig.Url = "http://localhost/hermes_net_v4/admin/web_service/setconfig.asmx";
    						setConfig.LogUser("XXXXXXX");
    						setConfig.Begin();
     
    						// < !--la partie Connection -->
    						Connection.Type = "SQLSERVER";
    						Connection.Login = "sa";
    						Connection.Password = "XXXXXXX";
    						Connection.Base = compaignName;
    						Connection.Server = "192.168.192.201";
    						Connection.Description = compaignName;
    						Connection.DatabaseConnection = "Provider=SQLOLEDB.1;User ID=sa;Password=XXXXXX;Initial Catalog=" + compaignName + ";Data Source=Localhost";
    						Connection.Name = compaignName;
    						Connection.Valid = true;
     
    						try
    						{
    							ws_service.CreateDatabaseWithConnectionString(Connection.DatabaseConnection, Connection.Type, Connection.Name);
    							Connection = setConfig.AddConnection(Connection);
     
    							MessageBox.Show("La chaîne de connexion " + Connection.Name.ToString() + " a été créée avec succès !");
     
    							setConfig.Commit();                                             
    							setConfig.Disconnect();
    							ClearCompaignName();
    						}
    						catch (Exception exp)
    						{
    							MessageBox.Show(exp.ToString());
    						}
    					});
                    }
                }
            }
     
    private void ClearCompaignName()
    {
    	if (CompaignName.InvokeRequired)
    	{
    		CompaignName.Invoke(new Action(() => this.ClearCompaignName()));
    	}
    	else
    	{
    		CompaignName.Text = "";
    	}
    }

    J'ai choisi l'approche avec l'exécution du webservice dans une tâche à part (cf le Task.Run). Pour éviter tout problème d'accès à des composants graphiques, j'ai sorti les différents appels. Ici, il y avait l'accès à CompaignName.Text. Je récupère donc le texte et le met dans une variable pour pouvoir réutiliser cette valeur sans avoir à passer par le composant.

    Ensuite, il y a une méthode supplémentaire : ClearCompaignName, qui en gros, correspond au CompaignName.Text = "" du code initial. On est obligé ici d'utiliser le pattern d'invocation (cf. https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx pour les détails). Ce qui se passe ici, c'est qu'on regarde si on est dans le thread graphique. Si oui, CompaignName.InvokeRequired est à false et on peut donc appeler directement CompagnName.text = "". Si non, CompaignName.InvokeRequired vaut true, et dans ce cas, on est obligé de demander au contrôle d'exécuter une méthode qu'on lui passe (cf. CompaignName.Invoke), et on lui demande de s'invoquer lui-même ! Mais lors de cette "invocation", le thread dans lequel s'exécute la méthode a changé. Ce n'est plus le thread qui exécutait la tâche, mais le thread graphique.

    Pour info, je n'ai pas tester le code. Il peut donc subsister des petites erreurs de syntaxe, mais le principe est là
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Novembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2016
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Un grand grand Merci ! je ne manquerai pas de passer en résolu le dès que j'aurais fini d'appliquer votre méthode.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Novembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2016
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Je viens de tester votre méthode ! c'est parfait !

    Un grand merci, vous m'avez vraiment apporter un plus avec la gestion des tâches.

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

Discussions similaires

  1. Appeler un web service avec pl/sql
    Par squalito dans le forum PL/SQL
    Réponses: 5
    Dernier message: 17/09/2012, 15h21
  2. Appels de Web services (SOAP) ?
    Par ovdbc dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 17/10/2007, 11h28
  3. [Web Services] Appel de Web Service (pb avec authentification)
    Par cicolas dans le forum Spring
    Réponses: 4
    Dernier message: 04/07/2006, 10h20
  4. [Débutant] Appeler un Web Service
    Par slyer dans le forum Services Web
    Réponses: 2
    Dernier message: 17/02/2006, 18h15

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