Salut à tous !
Je souhaiterai savoir quel procédé (délégué, threads, autres ?) utiliser pour pouvoir exécuter plusieurs appels à des méthodes asynchrones ?
Tout d'abord, j'ai un service web avec plusieurs méthodes :
- getListA(), getListB(), getListC() : retournent différentes structures me permettant de remplir des listes déroulantes
- doIt(), doThat(), work() : des méthodes diverses indépendantes
Au chargement du client (winform) j'instancie donc mon service web puis j'aimerai charger toutes mes listes déroulantes :
Code :
- //instanciation du service web
- private webService.MyWebService WS = new webService.MyWebService();
- public frmMain()
- {
- InitializeComponent();
- // Ajoute les gestionnaires d'événements pour les méthodes asynchrones utilisées
- WS.getListACompleted += new webService.getListACompletedEventHandler(getListACompleted);
- //idem pour getListBCompleted et getListCCompleted
- }
- private void frmMain_Load(object sender, EventArgs e)
- {
- WS.getListAAsync();
- WS.getListBAsync();
- WS.getListCAsync();
- }
- private void getListACompleted(object sender, webService.getListACompletedEventArgs completed)
- {
- //remplis la liste déroulante
- }
|
Par la suite, j'aurais aussi besoin d'appeller simultanément plusieurs méthodes du service web lors du click sur un bouton :
Code :
- private void btnWork_Click(object sender, EventArgs e)
- {
- WS.doIt();
- WS.doThat();
- WS.work();
- }
|
Voici le message d'erreur que j'obtiens lors du lancement de l'application :
Erreur lors du traitement asynchrone. Un état d'objet unique est requis pour que plusieurs opérations aychrones simultanées soient en attente.
Code :
- static class Program
- {
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new frmMain());
- }
- }
|
Jusqu'à présent je suis arrivé à "contrer" quelque peu le problème mais c'est vraiment pas joli... carrément crado même !
Quelques exemples de trucs à ne pas faire :
Code :
- private void frmMain_Load(object sender, EventArgs e)
- {
- WS.getListAAsync();
- Thread.Sleed(1000); // je sais, c'est pas bô !
- WS.getListBAsync();
- Thread.Sleed(1000);
- WS.getListCAsync();
- }
|
Il y a aussi un autre truc dans le même genre :
Code :
- private webService.MyWebService WS1 = new webService.MyWebService();
- private webService.MyWebService WS2 = new webService.MyWebService();
- private webService.MyWebService WS3 = new webService.MyWebService();
- private void frmMain_Load(object sender, EventArgs e)
- {
- WS1.getListAAsync();
- WS2.getListBAsync();
- WS3.getListCAsync();
- }
|
Et y'a aussi la solution d'exécuter uniquement getListAAsync(); lors du chargement du formulaire et d'exécuter getListBAsync(); dans le corps de getListACompleted après avoir rempli la première liste déroulante. C'est du chargement de listes déroulantes en cascade si l'on peut dire...
Bon, maintenant que je vous ai fais voir que j'étais capable du pire... est-ce que quelqu'un pourrait m'expliquer la bonne méthode à mettre en place ?
J'ai vu qu'il est possible de passer un paramètre userState de type Object lors de l'appel des méthodes asynchrone. Mais franchement j'ai rien compris à la doc MSDN... ça paraît être bien compliqué tout ça !
Merci de me donner votre avis et si vous avez une piste et/ou un bout de code en guise d'exemple ça serait super !
Lionel.