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
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.