Programmation C sharp/Fonctions asynchrones
Un livre de Wikibooks.
L'appel à une fonction se fait de manière synchrone : aucune autre instruction n'est exécutée avant que la fonction ne retourne une valeur. Cependant certaines fonctions prennent beaucoup de temps, en particulier les opérations d'entrées-sorties, et les fonctions de communication par réseau informatique.
Pour ce genre de fonction, l'API .Net possède souvent deux versions de la méthode :
- Une méthode synchrone qui attend la fin de l'opération avant d'en retourner le résultat,
- Une méthode asynchrone demandant au pool de threads standard d'effectuer l'opération, puis retourne immédiatement à la méthode appelante.
[modifier] Syntaxe et utilisation des méthodes asynchrones
Une méthode synchrone est déclarée selon la syntaxe suivante :
type_retour nom_methode ( arguments... )
La version asynchrones utilise deux autres méthodes. La première commence par Begin et demande au pool de threads standard d'effectuer l'opération. Une fois l'opération terminée, un delegate est appelé. Celui-ci appelle alors la méthode dont le nom commence par End pour récupérer la valeur retournée par la méthode asynchrone.
Ces deux méthodes ont la syntaxe suivante :
IAsyncResult Beginnom_methode ( arguments_non_ref...,
AsyncCallback callback, object state )
type_retour Endnom_methode ( IAsyncResult, arguments_ref )
Les arguments de la méthode synchrone se retrouvent répartis entre les deux méthodes :
- Les paramètres passés par valeur sont passés à la méthode Begin,
- Les paramètres de sorties (out et ref) sont passés à la méthode End.
La méthode Begin possède deux arguments supplémentaires :
- Un delegate de type AsyncCallback appelé quand l'opération est terminée (celui-ci doit alors appeler la méthode End correspondante),
- Un objet à transmettre au delegate.
[modifier] Le delegate AsyncCallback
La syntaxe du delegate AsyncCallback est la suivante :
public delegate void AsyncCallback(IAsyncResult result)
Le paramètre result est une interface de type IAsyncResult correspondant à celui retourné par la méthode Begin, et doit être passé à la méthode End.
[modifier] L'interface IAsyncResult
L'interface IAsyncResult possède les propriétés en lecture seule suivantes :
- object AsyncState
- Cet objet correspond à celui transmis à la méthode Begin.
- WaitHandle AsyncWaitHandle
- Cet objet de synchronisation est mis dans l'état signalé quand l'opération est terminée.
- bool IsCompleted
- Ce booléen vaut true (vrai) lorsque l'opération est terminée.
- bool CompletedSynchronously
- Ce booléen vaut true (vrai) si l'opération s'est terminée de manière synchrone.
