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

Silverlight Discussion :

Silverlight et service WCF asynchrone


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut Silverlight et service WCF asynchrone
    Bonjour à tous,

    Je suis débutant avec Silverlight et les services WCF.

    Je dois écrire une application qui, au démarrage, récupère des informations d'une base de données pour s'en servir plus tard. Elle récupère ces informations par l'intermédiaire de services WCF et stocke ces informations dan une classe statique qui est accessible dans l'application.

    Le problème, en utilisant les services WCF de façon asynchrone, c'est que mon interface s'affiche déjà que les informations sont toujours en train d'être récupérées, ce qui est du à l'utilisation de services asynchrones.

    Quelle est la meilleure technique pour résoudre ce problème ?

    Comment puis-je faire en sorte d'afficher à l'utilisateur une fenêtre de chargement au démarrage jusqu'à ce que toutes les informations aient été récupérées puis enfin afficher l'interface principale ?

    D'avance merci.
    fterf.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Tu peux utiliser le busyIndicator du toolkit. Celui-ci affiche un genre de popup indiquant qu'il faut patienter.

    Derrière tu dois gérer une liste de tes appels asynchrone, et quand tout tes appels sont revenus, tu arretes le busyIndicator.

    Pour t'aider pour gérer la liste des appels asyncrhone tu peux utiliser un helper de Samuel Blanchard :
    http://blog.naviso.fr/wordpress/?p=264

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Merci beaucoup, cela a l'air très intéressant !
    Je regarde ça et je te dis quoi.
    Encore merci pour ton aide.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Bonjour,

    Il y a quelque chose que je ne comprends pas. On peut lire partout sur le Web que les services WCF fonctionnent par défaut en demande-réponse et donc que lorsque le client envoie une demande au service, il reste bloqué jusqu'à ce qu'il reçoive la réponse.

    Or, si on utilise les services WCF de manière standardisée, on voit bien que le client ne reste absolument pas bloqué (fonctionnement asynchrone). Y-a-t-il un paramètre à ajuster dans ce cas ?

    Encore merci pour votre aide.

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Il y a bien une question / réponse mais pourquoi le client devrait il être bloqué?
    C'est le même principe qu'un navigateur internet, ton onglet attend la réponse mais pour autant tu ne bloques pas toute l'application.

    En fait je comprend pas la question

  6. #6
    Membre très actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 250
    Par défaut
    Salut,
    Tu n'as pas le choix pour Silverlight, c'est WCF Asynchrone OBLIGATOIRE.

    La meilleure solution est celle qui t'ai proposée : un petit " loading..."

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Bonjour,

    En fait je ne me suis pas encore familiarisé avec le développement Web, je suis développeur client-serveur (applications standalone) à la base, et ce genre de notion m'échappe un peu.

    Il me semble qu'il y a pourtant moyen de faire en sorte d'attendre la fin du traitement avant de poursuivre non ? A moins que ce ne se soit une limitation (ou plutôt une bonne chose ça dépend des cas) de Silverlight.

    Encore merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fterf Voir le message
    Il y a quelque chose que je ne comprends pas. On peut lire partout sur le Web que les services WCF fonctionnent par défaut en demande-réponse et donc que lorsque le client envoie une demande au service, il reste bloqué jusqu'à ce qu'il reçoive la réponse.
    Effectivement tu n'as pas bien compris la notion de question/réponse de WCF.
    Pour infos WCF dispose de 3 MEP (Message Exchange Pattern) qui sont :
    • Question/Réponse : qui signifie que le client envoie un message au service et s'attend toujours à une réponse même vide.
    • One way : signifie que le client envoie envoie un message au service et ne s'attend pas à recevoir une réponse même si l'opération demandée ne se déroule pas comme voulue (sans erreur etc )
    • Duplex : utilisé pour la communication en duplex c'est à dire mettre en place une interactivité entre le client et le serveur.


    Dans les 3 cas c'est le Dispatcher du client qui est utilisé pour envoyer les messages et ce dispatcher est bloqué tant que l'exécution de l'opération demandée sur le serveur n'est pas terminée même dans le cas du MEP One Way. Pour éviter ce blocage du client que les appels des opérations du services peuvent se faire de manière asynchrone et cela est obligatoire quand on utilise WCF avec du Silvelright.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Ok merci pour toutes ces explications.
    J'ai essayé avec la classe Batch et la BusyIndicator, cela marche sans problème.
    Pas contre je ne comprends pas très bien la syntaxe suivante :

    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
     
     
    # // Le WebService  
    # batch.Add(  
    #     (b) =>  
    #     {  
    #         TestServiceSoapClient client = new Services.TestServiceSoapClient();  
    #   
    #         // fin de l'appel  
    #         client.HelloWorldCompleted += (s, ev) =>  
    #         {  
    #             if (ev.Error == null)  
    #             {  
    #                 MessageBox.Show(ev.Result);  
    #   
    #                 // on peut utiliser b directement  
    #                 //b.IsCompleted = true;  
    #                 // autre possibilitées  
    #                 BatchAction action = ev.UserState as BatchAction;  
    #                 action.IsCompleted = true;  
    #             }  
    #         };  
    #   
    #         // un userState peut être mis dans b si necessaire  
    #         //b.UserState = monUserState;  
    #         // appel  
    #         client.HelloWorldAsync(b);  
    #     }  
    # );
    C'est le => et le b dans ce code que je ne comprends pas très bien.

    N'y-a-t-il pas moyen de faire un truc du genre : Batch.Add(ChargerDonnees) où ChargerDonnees est une méthode void qui est censée charger les données par l'intermédiaire du WS ?

    Encore merci à tous.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fterf Voir le message
    N'y-a-t-il pas moyen de faire un truc du genre : Batch.Add(ChargerDonnees) où ChargerDonnees est une méthode void qui est censée charger les données par l'intermédiaire du WS ?
    Yep ! C'est possible en faisant comme suit :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     // Le WebService  
     batch.Add(chargerDonnees);

    et ta méthode ChargerDonnees doit ressembler à ça :
    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
     
    public void ChargerDonnees(BatchAction b)
    {  
             TestServiceSoapClient client = new Services.TestServiceSoapClient();  
     
             // fin de l'appel  
             client.HelloWorldCompleted += (s, ev) =>  
             {  
                 if (ev.Error == null)  
                 {  
                     MessageBox.Show(ev.Result);  
     
                     // on peut utiliser b directement  
                     //b.IsCompleted = true;  
                     // autre possibilitées  
                     BatchAction action = ev.UserState as BatchAction;  
                     action.IsCompleted = true;  
                 }  
             };  
     
             // un userState peut être mis dans b si necessaire  
             //b.UserState = monUserState;  
             // appel  
             client.HelloWorldAsync(b);  
         }

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Ok merci beaucoup je comprends mieux et ça marche nickel
    C'est vraiment agréable de tomber sur des gens qui partagent leur savoir.
    A bientôt pour de nouvelles aventures

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Bonjour à tous,

    J'utilise la technique préconisée avec le batch et ça marche très bien, mais pour chaque action je souhaiterais mettre à jour le texte affiché dans ma BusyIndicator (le BusyContent). Or, seul le texte de la dernière action est affiché, les autres ne se remarquent même pas.

    Une idée ?

    Merci.

  13. #13
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Comment ca pour chaque action?
    Elles sont lancés simultanément. Le truc possible c'est d'indiquer la derniere qui a fini, sinon je vois pas!
    Quel est ton code?

  14. #14
    Membre confirmé Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Par défaut
    A chaque fois que tu passes dans ta méthode "completed" du service WCF tu remets à jour le texte de ton busy indicator

Discussions similaires

  1. Silverlight et service WCF hebergé dans console
    Par matdur dans le forum Windows Communication Foundation
    Réponses: 3
    Dernier message: 15/06/2010, 16h04
  2. Service WCF Asynchrone
    Par rikidude dans le forum Services Web
    Réponses: 3
    Dernier message: 15/07/2009, 22h26
  3. silverlight et service wcf
    Par goubidik dans le forum Silverlight
    Réponses: 9
    Dernier message: 21/08/2008, 13h52
  4. Réponses: 7
    Dernier message: 16/04/2008, 16h42

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