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

Windows Phone .NET Discussion :

WebClient + Dispatcher


Sujet :

Windows Phone .NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut WebClient + Dispatcher
    Salut à tous

    Voila, j'ai beau chercher et tester mais ça ne passe pas !

    J'essaye d’imbriquer un WebClient.DownloadStringCompleted au sein d'un dispatcher pour bloquer le thread principal en attente de ma réponse.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            public void getData()
            {
                string uri = "http://" + ip + "/Isibudget/login/login.php?login=" + log + "&mdp=" + mdp;
                client.DownloadStringCompleted += ClientConnec;
                client.DownloadStringAsync(new Uri(uri));
            }
     
            public void ClientConnec(object sender, DownloadStringCompletedEventArgs e)
            {
                userFromPhp = e.Result
     
            }
    J'ai essayé de reprendre ce principe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ManualResetEvent completionEvent = new ManualResetEvent(false);
    WebClient webClient = new WebClient();
    webClient.DownloadStringCompleted +=delegate(object sender, DownloadStringCompletedEventArgs e)
    {
        completionEvent.Set();
    };
     
    webClient.DownloadStringAsync(new Uri(uri));
    completionEvent.WaitOne();
    mais le thread principal a filé sans attendre !

    Quelqu'un aurait une idée pour faire marcher cette solution ou aurait une toute autre solution ?

    Merci, bonne soirée !

  2. #2
    Expert confirmé
    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 : 4 062
    Points
    4 062
    Par défaut
    Comment est invoqué getData ?

    S'il ne l'est pas depuis le thread principal c'est normal.
    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Le code est fait de cette maniere :

    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
    private void Button_Tap(object sender, System.Windows.Input.GestureEventArgs e)
            {
                tbEchec.Text = string.Empty;
                if (VerifSaisie())
                {
                    login = Login.Text;
                    mdp = Mdp.Password;
     
                    ConnexionDAO recuperationConnexion = new ConnexionDAO(login, mdp);
     
                    recuperationConnexion.getData();
     
                    var res = ConnexionDAO.userFromPhp;
     
     
                    if (res == null)
                    {
                        //isolated storage
                        if (cbSaveMe.IsChecked.Value)
                        {
                            IsolatedStorageSettings.ApplicationSettings["login"] = login;
                            IsolatedStorageSettings.ApplicationSettings["mdp"] = mdp;
                        }
                        //Redirection vers la page des comptes
                        NavigationService.Navigate(new Uri("/Vue/ListeDesComptes.xaml", UriKind.Relative));
                    }
                    else
                    {
                        tbEchec.Text = "Echec connexion";
                        tbEchec.Foreground = new SolidColorBrush(Colors.Red);
                    }
                }
            }

    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
    public class ConnexionDAO
        {
            public string log;
            public string mdp;
            public WebClient client = new WebClient();
            public static Utilisateur userFromPhp;
     
            public ConnexionDAO(string login, string MotDePasse)
            {
                this.log = login;
                this.mdp = MotDePasse;
            }
     
            public void getData()
            {
                string uri = "blablabla";
     
                ManualResetEvent completionEvent = new ManualResetEvent(false);
                client.DownloadStringCompleted += ClientConnec;
                {
                    completionEvent.Set();
                };
     
                client.DownloadStringAsync(new Uri(uri));
                completionEvent.WaitOne();
            }
     
            public void ClientConnec(object sender, DownloadStringCompletedEventArgs e)
            {
                userFromPhp = ConstructUserFromPhp(e.Result, "<user>", "</user>");
            }
    Merci de ton aide

  4. #4
    Expert confirmé
    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 : 4 062
    Points
    4 062
    Par défaut
    Le Set devrait être appelé à la fin de ClientConnec :

    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
    ManualResetEvent completionEvent = new ManualResetEvent(false);
     
    public void getData()
    {
        string uri = "blablabla";
     
        completionEvent.Reset();
     
        client.DownloadStringCompleted += ClientConnec;
        client.DownloadStringAsync(new Uri(uri));
        completionEvent.WaitOne();
    }
     
    public void ClientConnec(object sender, DownloadStringCompletedEventArgs e)
    {
        userFromPhp = ConstructUserFromPhp(e.Result, "<user>", "</user>");
        completionEvent.Set();
    }
    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    En suivant ton code, il ne se passe plus rien

    L'appli passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            public void getData()
            {
                string uri = "blablabla";
                completionEvent.Reset();
     
                client.DownloadStringCompleted += ClientConnec;
                client.DownloadStringAsync(new Uri(uri));
                completionEvent.WaitOne();
            }
    puis plus rien, je pense que l'appli est en état 'attente' mais rien n'arrive. Comment cela se fait-il ?


    Merci !

  6. #6
    Expert confirmé
    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 : 4 062
    Points
    4 062
    Par défaut
    Ton thread principal se met en attente de la fin du téléchargement.
    Par conséquent l'UI devient inactive puisque les messages impactant son rendu ne sont plus traités par ce thread.

    D'ailleurs pourquoi veux-tu absolument bloquer ton thread principal ?
    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Je veux bloquer le thread principal car lorsque j'appelle mon fichier php qui va executer la requête sur le serveur pour vérifier si les identifiants fournit sont les bons, il faut que je le bloque pour avoir le résultat de ma requête.

  8. #8
    Expert confirmé
    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 : 4 062
    Points
    4 062
    Par défaut
    Plutôt que de bloquer le thread il vaudrait mieux désactiver le contenu de l'interface et afficher par dessus un spinner indiquant qu'une opération est en cours.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Je ne connait pas du tout le Spinner

    Quel est son principe ? C'est comme un rond qui tourne avec écrit 'Chargement' ?

    Et pour bloquer le déroulement de la méthode qui doit attendre la valeur, comment procéderais tu ?

    Le spinner est censé s'en charger ?

  10. #10
    Expert confirmé
    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 : 4 062
    Points
    4 062
    Par défaut
    Oui le spinner est un exemple, mais tu peux utiliser un simple TextBlock avec un message "loading...".

    Tu ne bloques pas les méthodes mais tu désactives l'interface pour ne plus que l'utilisateur n'interagisse avec : e.g. si ton panel principal est une Grid nommée "panel" tu fais : panel.IsEnabled = false et au contraire tu affiches le composant avec le message loadingComponent.Visibility = Visibility.Visible.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    D'accord, à ce niveau là sa va je sais faire ;-)

    Mais je ne voit pas comment est-ce que le fait e bloquer l4UI va empêcher le traitement de s’exécuter.

    exemple, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    connexion con = new con()
     
    con.getData()
     
    string temp = con.valuefromPhp;
     
    if (temp !=null)
    {
    bla bla bla
     
    }
    Bloquer l'UI avant mon getData par exemple n’empêchera pas le code d'arriver à cette ligne :

    if (temp !=null)

    avant d'avoir reçu les données du php ...

    Je veux vraiment que le code s'arrête, et attende la réponse du php

    comme je t'ai dit, ton code avec le WaitOne ne fonctionnait pas, dès que je passe dedans, il ne se passe plus rien, même la réponse du php n'arrive pas.

    Merci de t'investir dans le sujet, c'ets super sympa ;-)

  12. #12
    Expert confirmé
    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 : 4 062
    Points
    4 062
    Par défaut
    Tout ce code doit être exécuté à la fin du ClientConnec.

    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
    void UpdateUI()
    {
        var res = ConnexionDAO.userFromPhp;
     
        if (res == null)
        {
            //isolated storage
            if (cbSaveMe.IsChecked.Value)
            {
                IsolatedStorageSettings.ApplicationSettings["login"] = login;
                IsolatedStorageSettings.ApplicationSettings["mdp"] = mdp;
            }
            //Redirection vers la page des comptes
            NavigationService.Navigate(new Uri("/Vue/ListeDesComptes.xaml", UriKind.Relative));
        }
        else
        {
            tbEchec.Text = "Echec connexion";
            tbEchec.Foreground = new SolidColorBrush(Colors.Red);
        }
    }
     
    public void ClientConnec(object sender, DownloadStringCompletedEventArgs e)
    {
        userFromPhp = ConstructUserFromPhp(e.Result, "<user>", "</user>");
     
        cbSaveMe.Invoke(UpdateUI);
    }
    Le Invoke est nécessaire car le callback ClientConnec est invoqué sur un thread du pool.

    Tu pourrais aussi utiliser le BackgroundWorker mais ça n'apportera pas grand chose si ce n'est un peu de sémantique.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Je test tout ça ce soir !

    Tu m'es d'une grande aide, merci !

    Bonne journée

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Super merci, j'ai du déplacer deux trois méthodes à gauche à droite mais tout roule !

    Un énorme merci !


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

Discussions similaires

  1. dispatcher.forward en PHP ?
    Par nebuli dans le forum Langage
    Réponses: 9
    Dernier message: 17/03/2006, 15h56
  2. DRIVER - fonctions dispatch - soucis de compilation
    Par - Robby - dans le forum Windows
    Réponses: 1
    Dernier message: 26/01/2006, 22h13
  3. [Mail] dispatching de mail ??
    Par sami_c dans le forum Langage
    Réponses: 6
    Dernier message: 28/03/2005, 12h53
  4. Aide sur DISPATCH et OCX
    Par fredderf dans le forum MFC
    Réponses: 4
    Dernier message: 11/02/2005, 12h28
  5. ORA-30625 method dispatch on NULL SELF argument is disallowe
    Par azizi_naceur dans le forum Oracle
    Réponses: 3
    Dernier message: 25/01/2005, 17h21

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