Programmation C sharp/Fonctions asynchrones

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche
Programmation C#
Programmation C#
Sommaire
Le langage
Programmation avancée
API .Net
Ressources
Modifier ce modèle

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.

Syntaxe et utilisation des méthodes asynchrones[modifier | modifier le wikicode]

Une méthode synchrone est déclarée selon la syntaxe suivante :

type_retour nom_methode ( arguments... )

La version asynchrone 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 :

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.

Le delegate AsyncCallback[modifier | modifier le wikicode]

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.

L'interface IAsyncResult[modifier | modifier le wikicode]

L'interface IAsyncResult possède les propriétés en lecture seule suivantes :

  • Propriété généralement utilisée par le delegué appelé quand l'opération est terminée :
    object AsyncState
    Cet objet correspond à celui transmis à la méthode Begin.
  • Propriétés généralement utilisées par le code appelant la méthode Begin de l'opération asynchrone :
    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.

La propriété AsyncWaitHandle permet de lancer une opération asynchrone, d'effectuer d'autres traitements durant l'opération en cours, et finalement attendre la fin de l'opération si elle ne s'est pas déjà terminée, en testant la propriété IsCompleted.