begin process at 2008 08 08 21:42:53
1 223 607 membres
365 nouveaux aujourd'hui
14 230 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INVOCATION ASYNCHRONE D'UNE FONCTION / WEBSERVICE


Information sur la source

Catégorie :Applications Source .NET ( DotNet ) Classé sous : asynchrone, invoke, begininvoke, webservice, iasyncresult Niveau : Débutant Date de création : 12/08/2004 Date de mise à jour : 12/08/2004 22:49:29 Vu / téléchargé: 9 875 / 212

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note


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

  • #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();
  • }
#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
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

12 août 2004 22:49:29 :
rajout appel Service Web de facon asynchrone
  • signaler à un administrateur
    Commentaire de rorgmanche le 01/06/2005 22:33:39

    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 ?

  • signaler à un administrateur
    Commentaire de pebg le 17/04/2007 15:00:51

    Beau travail !

    Merci

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS