Invocation asynchrone d'une fonction / webservice

Soyez le premier à donner votre avis sur cette source.

Vue 19 307 fois - Téléchargée 413 fois

Description

Ce bout de code, vous montre comment appeller une fonction de facon asynchrone

il y a trois exemples, le premier appelle l'addition, puis renvoie le resultat dans le thread principale, le deuxieme exemple appelle une autre fonction dans le second thread à la suite de l'addition
le troisieme : celui la est entierement de moi, il montre comment appeller un Service Web, et afficher un message d'attente, j'ai pas mis l'exemple 3 dans le application.console car je me sers d'un label.

/!\ Attention si vous fermer le thread principale avant la fin du thread secondaire, les données du thread secondaire seront perdus

Cet exemple n'est pas tout à fait de moi, c'est la traduction, d'un exemple VB.net tiré du livre de Richard Clark (c2i.fr) "Au coeur de Visual Basic.net"

J'ai mis un zip, mais attention, j'ai créer le code avec Visual C# Express 2005 Beta, donc il vous faut absolument la framework 2.0 pour faire fonctionner l'application.
Pour la telecharger : --> http://lab.msdn.microsoft.com/express/

Source / Exemple :


#region Using directives

using System;
using System.Collections.Generic;
using System.Text;

#endregion

namespace ConsoleApplication1
{
    class Program
    {
        public delegate int Proto(int x, int y);

        public static int Addition(int x, int y)
        {
            Console.WriteLine("Debut Addition");
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("Fin addition");
            return x + y;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("--------- Debut de l'exemple 1 ---------");
            Exemple1();

            Console.WriteLine("");
            Console.WriteLine("");

            Console.WriteLine("--------- Debut de l'exemple 2 ---------");
            Exemple2();

            Console.ReadLine();

        }

        public static void Exemple1()
        {
            Proto oProto = new Proto(Addition);
            IAsyncResult iAr;
            Console.WriteLine("Avant l'invocation");
            iAr = oProto.BeginInvoke(5, 6, null, null);

            //Vous pouvez ici placé du code qui sera executé tout de suite aprés

            //s'executera tant que notre Addition n'est pas finis
            while (!iAr.AsyncWaitHandle.WaitOne(100, false))
            {
                Console.WriteLine("Et alors ?");
            }

            int iResult = oProto.EndInvoke(iAr);

            Console.WriteLine(iResult);
            Console.ReadLine();
        }

        public static void Exemple2()
        {
            Proto oProto = new Proto(Addition);
            IAsyncResult iAr;
            Console.WriteLine("Avant l'invocation");

            iAr = oProto.BeginInvoke(5, 6, FinAppel, oProto);
            Console.WriteLine("Fin de l'invocation");

            //Vous pouvez ici placé du code qui sera executé tout de suite aprés
//Si celui ci est moins long que l'autre thread, l'autre thread sera fermé !!!!!
            // comme notre addition dure 1000ms on peut attendre 1200ms 
            
            System.Threading.Thread.Sleep(1200);

        }

        public static void FinAppel(IAsyncResult iAr)
        {
            Proto oProto = (Proto)iAr.AsyncState;
            int iResult = oProto.EndInvoke(iAr);
            Console.WriteLine(iResult);
        }
    }
}

        private static void Exemple3(object sender, EventArgs e)
        {
            DownloadFile.Service1 DF = new DownloadFile.Service1();
            IAsyncResult iAr = DF.BeginGetCategories(null, null);
            int i = 0;
            while (!iAr.AsyncWaitHandle.WaitOne(200, false))
            {
                i++;
                Label1.Text = "Chargement des données en cours";
                for (int i2 = 0; i2 <= (i % 3); i2++)
                {
                    Label1.Text += ".";
                }
	//Application.DoEvents() sinon ca bug, mais j'ai encore pas compris la raison
                Application.DoEvents();
            }

            checkedListBox1.DataSource = DF.EndGetCategories(iAr);
            Label1.Text = "Prêt";

            DF.Dispose();
            checkedListBox1.Focus();
        }

Conclusion :


Voici le contenu de la console aprés execution :

--------- Debut de l'exemple 1 ---------
Avant l'invocation
Debut Addition
Et alors ?
Et alors ?
Et alors ?
Et alors ?
Et alors ?
Et alors ?
Et alors ?
Et alors ?
Et alors ?
Et alors ?
Fin addition
11

--------- Debut de l'exemple 2 ---------
Avant l'invocation
Fin de l'invocation
Debut Addition
Fin addition
11

J'attends vos commentaires/Notes avec impatience

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
17 avril 2007

Beau travail !

Merci
Messages postés
4
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
9 août 2005

Très bon exemple,
Merci beaucoup de l'avoir publié. Je débute avec .net et je cherchais justement le moyen de pouvopir invoker une fonction (pour se connecter à un serveur musql)de manière asynchrone.
J'ai deux questions:
Comment installer un timeout à cet invokation afin de la tuer lorsqu'elle est bloqué ?
Est ce que le EndInvoke tue le thread utiliser par le BeginInvoke ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.