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

Services Web Discussion :

[C# 1.1] Comment gérer l'appel en multi-threading ?


Sujet :

Services Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Par défaut [C# 1.1] Comment gérer l'appel en multi-threading ?
    Bonjour,

    Environnement :
    Je developpe une application Asp.Net(C#) sous win XP, sous visual studio 2003, en framework 1.1.

    Application :
    L’application est une application d’annuaire. Cette application invite l’utilisateur a saisir un certains nombres de paramètres (nom, prénom) et a choisir dans un menu déroulent une zone géographique (6 zones en tout), puis appelle un web service qui renvoie un tableau de personnes. Suivant la zone géographique choisi, le web service n’est pas le même. En fait dans le fond, il fait la même chose et possède les mêmes méthodes mais chaque région genre son propre web service donc les url ne sont pas les mêmes.
    On voudrait, si la recherche pour la région choisie est infructueuse, proposer une recherche dans les 5 autres régions restantes. Dans un souci de gain de temps, on voudrait faire cela en multi threading, càd effectuer un appel de web service par thread.
    Pour le moment, j’ai une fonction qui boucle sur les 5 autres régions, et une fonction Recherche qui a en paramètre l’url du web service et en sorti un tableau de personne.
    Il faudrait donc que dans la boucle, j’implémente un thread qui appelle la fonction Recherche. Ainsi a chaque passage dans la boucle un nouveau thread est créé, appelant la méthode getPersonne(nom, prénom) du webservice.

    Problème :
    Je n’ai jamais fait de multi threading et je ne m’en sors pas vraiment avec la création des threads et l’appel par ceux-ci de la fonction de recherche. J’ai regarde la faq sur les threads en c# mais la façon de créer ce multithreading dans mon cas n’est vraiment pas clair pour moi.
    Je voudrais trouver un exemple de cde faisant quelque chose de similaire, ou alors une description des différentes étapes et de la façon de récupérer le résultat renvoyé par la fonction Recherche.
    Enfin, je dois pouvoir concaténer les résultats obtenus par mes 5 threads (et donc savoir quand les 5 sont terminés) pour pouvoir afficher la totalité des résultats dans un autre formulaire.

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Les webservices proposent nativement un appel asynchrone à leurs méthodes.
    Je pense que ça peut te convenir

    http://stephaneey.developpez.com/tut...bservice/#L1.5

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Par défaut
    Bonjour,

    il est vrai que je n'etais pas parti dans ce sens car le cahier des charges spécifiait qu'il fallait un thread par appel de webservice, je l'avais donc pris au mot . Je vais regarder comment fonctionne les appels asynchrones et si ca s'adapte bien à ce que je veux faire, mais a priori, pourquoi pas!
    Merci!

  4. #4
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par rastali
    Bonjour,

    il est vrai que je n'etais pas parti dans ce sens car le cahier des charges spécifiait qu'il fallait un thread par appel de webservice, je l'avais donc pris au mot . Je vais regarder comment fonctionne les appels asynchrones et si ca s'adapte bien à ce que je veux faire, mais a priori, pourquoi pas!
    Merci!
    C'est ça en gros.
    T'appelle ta WebMethod, tu récupères la main et y a un CallBack qd ta webmethod te retourne le résultat

  5. #5
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut
    Bon, je te le fais vite fait. On the fly comme on dit.

    1 il ta faut une classe pour récup tes données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class CBlabla
    {
       CResultFromWebService m_WSAnswer;
     
    }
    2 il te faut aussi de quoi parametrer ton WS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    string m_WSToConnect;
    ...
    3 il te faut une variable qui te dit si le thread est fini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    bool m_ThreadFinished;
    ...
    4 il te faut une méthode de type void glop() qui va contenir l'action à effectuer pendant le thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
     void LaunchWS()
     {
       m_ThreadFinished = true;   
       //ton code pour lancer le WS
       m_WSAnswer = //resultat de ton webservice 
       m_threadFinished = false;
     }
    ...
    Ensuite ds ta boucle il te reste à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CBlabla m_Bla = new CBlabla();
    m_Bla.m_WSToConnect = //a toi de voir
    Thread ThreadWS = new Thread(new ThreadStart(m_Bla.LaunchWS));
    ThreadWS .Start();

    Voilà, c'est l'idée de base. Si t'as des questions...

  6. #6
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Par défaut
    Merci! je teste et je vous dit quoi .

    bilb0t -> ton exemple utilise les threads et non les methodes asynchrones des web services? quelle est la meilleure methode?

    je ne comprends pas vraiment ton code (je n'ai jamais joué avec les threads...), et surtout la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void LaunchWS()
    {
       m_ThreadFinished = true;   
       //ton code pour lancer le WS
       m_WSAnswer = //resultat de ton webservice 
       m_threadFinished = false;
    }
    Je ne vois pas bien comment utiliser la variable m_ThreadFinised.

    En fait je dois lancer en parallele un nombre de thread non fini (car le nb de region peut augmenter), et une fois que les ws ont renvoyes leurs resultats, concatener ces resultats. Et avec ton exemple je ne vois pas trop comment faire ca...

    Plus precisemment, si dans ma boucle je fais ca:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CBlabla m_Bla = new CBlabla();
    m_Bla.m_WSToConnect = //a toi de voir
    Thread ThreadWS = new Thread(new ThreadStart(m_Bla.LaunchWS));
    ThreadWS .Start();
    m_Bla va etre ecrase a chaque nouveau passage dans la boucle et du coup je ne pourrais pas recuperer le resultat... enfin si j'ai bien compris ce qu'il fallait faire.

  7. #7
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut
    Salut,

    Il ne faut bien sur pas prendre mon code comme les saintes écritures...

    Si tu veux garder le résultats de tes variables tu peux les empiler ds un arrayList par exemple...

    Si j'étais toi et que je veuille absolument jouer avec les threads (bien que la méthode asynchrone soit probablement plus adaptées) je ferais ds la méthode d'envoie des messages au WS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     for(int i=0;i<nbThreadToLaunch;i++)
    {
     CBlabla bla = new CBlabla();
     m_BlaArray.Add(bla); //m_BlaArray est un ArrayList membre de ta classe
     bla.m_WSToConnect = //a toi de voir
     Thread ThreadWS = new Thread(new ThreadStart(bla.LaunchWS));
     ThreadWS .Start();
    }
    Ensuite ds la classe de ton applic, tu peux parcourir ton arraylist et voir si chaque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bla.m_ThreadFinished==true
    Bien sur une fois de plus, tu peux adapter comme par exemple créer un enum de tes régions et transformer ton ArrayList en un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CBlabla blaTab[] = new CBlabla[ELastRegion];
    Tu peux aussi créer un Thread qui toute les x sec irait voir si tes bla sont finit et qui rafraichirait un form, ...

    Y a moyen de s'amuser, quoi...

  8. #8
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Par défaut
    Salut!

    merci! effectivement c'etait la fin de journée et je n'ai pas beaucoup reflechi... j'ai pris le code comme etant complet et je m'etonnais donc de ne pas voir le resultat sauvé... bref, ca marche parfaitement, donc merci beaucoup de ton aide!
    J'ai egalement mis en place la solution avec la methode asynchrone et finalement les deux solutions sont bonnes, et offrent des performances similaires, donc merci egalement a ceux qui m'ont aides pour mettre en place la methode asynchrone.
    Pour info sur le choix de la methode, j'ai propose les deux et jattends le retour quand a la methode a privilégier.

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

Discussions similaires

  1. [vb2005] Comment connaitre le menu d'appel parent ?
    Par zzzmoi dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/07/2006, 14h17
  2. Comment creer un ocx pour appel dans page html
    Par minette dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 19/07/2006, 12h21
  3. Réponses: 2
    Dernier message: 11/07/2006, 10h34
  4. Comment réaliser un Form pour Appel à Cotisation
    Par auriolbeach dans le forum IHM
    Réponses: 7
    Dernier message: 26/05/2006, 06h52
  5. Comment mon lecteur disquette s'appele-t-il ?
    Par tsing dans le forum Périphériques
    Réponses: 2
    Dernier message: 17/12/2005, 15h57

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