Vue d'ensemble de la programmation asynchrone
Une opération asynchrone qui utilise le modèle de design IAsyncResult est implémentée sous la forme de deux méthodes nommées BeginNomOpération et EndNomOpération qui commencent et terminent respectivement l'opération asynchrone NomOpération. Par exemple, la classe FileStream fournit les méthodes BeginRead et EndRead pour lire, de façon asynchrone, des octets à partir d'un fichier. Ces méthodes implémentent la version asynchrone de la méthode Read.
Après avoir appelé BeginNomOpération, une application peut continuer à exécuter les instructions sur le thread appelant pendant que l'opération asynchrone s'exécute sur un thread différent. Pour chaque appel à BeginNomOpération, l'application doit également appeler EndNomOpération afin d'obtenir les résultats de l'opération.
Début d'une opération asynchrone
La méthode Begin OperationName commence l'opération asynchrone OperationName et retourne un objet qui implémente l'interface IAsyncResult. Les objets IAsyncResult stockent les informations à propos d'une opération asynchrone. Le tableau suivant affiche les informations relatives à une opération asynchrone.
Membre |
Description |
---|---|
Objet facultatif spécifique à l'application contenant les informations relatives à l'opération asynchrone. |
|
WaitHandle pouvant être utilisé pour bloquer l'exécution de l'application jusqu'à ce que l'opération asynchrone se termine. |
|
Valeur indiquant si l'opération asynchrone s'est terminée sur le thread utilisé pour appeler BeginNomOpération plutôt que sur un thread ThreadPool séparé. |
|
Valeur indiquant si l'opération asynchrone est terminée. |
Une méthode BeginNomOpération accepte tous les paramètres déclarés dans la signature de la version synchrone de la méthode qui sont passés par valeur ou par référence. Aucun des paramètres out ne fait partie de la signature de méthode BeginNomOpération. La signature de méthode BeginNomOpération inclut également deux paramètres supplémentaires. Le premier de ces deux paramètres définit un délégué AsyncCallback qui fait référence à une méthode appelée lorsque l'opération asynchrone se termine. L'appelant peut spécifier null (Nothing en Visual Basic) s'il ne souhaite pas qu'une méthode soit appelée lorsque l'opération se termine. Le deuxième paramètre supplémentaire est un objet défini par l'utilisateur. Cet objet peut être utilisé pour passer des informations d'état spécifiques à l'application à la méthode appelée lorsque l'opération asynchrone se termine. Si une méthode BeginNomOpération accepte des paramètres supplémentaires correspondant à l'opération, tels qu'un tableau d'octets pour stocker des octets lus à partir d'un fichier, AsyncCallback et l'objet d'état de l'application sont les derniers paramètres dans la signature de méthode BeginNomOpération.
BeginOperationName retourne immédiatement le contrôle au thread appelant. Si la méthode BeginNomOpération lève des exceptions, les exceptions sont levées avant le lancement de l'opération asynchrone. Si la méthode BeginNomOpération lève des exceptions, la méthode de rappel n'est pas appelée.
Fin d'une opération asynchrone
La méthode EndNomOpération termine l'opération asynchrone NomOpération. La valeur de retour de la méthode EndNomOpération a le même type que celui retourné par son équivalent synchrone et est spécifique à l'opération asynchrone. Par exemple, la méthode EndRead retourne le nombre d'octets lus à partir d'un FileStream et la méthode EndGetHostByName retourne un objet IPHostEntry contenant des informations à propos d'un ordinateur hôte. La méthode EndNomOpération accepte tout paramètre out ou ref déclaré dans la signature de la version synchrone de la méthode. Outre les paramètres de la méthode synchrone, la méthode EndNomOpération inclut également un paramètre IAsyncResult. Les appelants doivent passer l'instance retournée par l'appel correspondant à BeginNomOpération.
Si l'opération asynchrone représentée par l'objet IAsyncResult n'est pas terminée lorsque la méthode EndNomOpération est appelée, EndNomOpération bloque le thread appelant jusqu'à la fin de l'opération asynchrone. Les exceptions levées par l'opération asynchrone sont levées à partir de la méthode EndNomOpération. Les conséquences de plusieurs appels à la méthode EndNomOpération avec le même IAsyncResult ne sont pas définies. De même, l'appel de la méthode EndNomOpération avec un IAsyncResult qui n'a pas été retourné par la méthode Begin associée n'est pas non plus défini.
Remarque |
---|
Pour l'un ou l'autre de ces scénarios indéfinis, les implémenteurs doivent envisager la levée d'une InvalidOperationException. |
Remarque |
---|
Les implémenteurs de ce modèle de design doivent informer l'appelant que l'opération asynchrone est terminée en affectant la valeur true à IsCompleted, en appelant la méthode de rappel asynchrone (si une méthode a été spécifiée) et en signalant le AsyncWaitHandle. |
Les développeurs d'applications ont plusieurs choix de design pour accéder aux résultats de l'opération asynchrone. Le choix correct varie selon que l'application possède ou non des instructions pouvant être exécutées pendant que l'opération se termine. Si une application ne peut pas exécuter de tâches supplémentaires avant de recevoir les résultats de l'opération asynchrone, elle doit se bloquer jusqu'à ce que les résultats soient disponibles. Pour bloquer l'application jusqu'à ce qu'une opération asynchrone se termine, vous pouvez utiliser l'une des approches suivantes :
Appelez EndNomOpération à partir du thread principal de l'application, ce qui bloque l'exécution de l'application jusqu'à ce que l'opération soit terminée. Pour obtenir un exemple illustrant cette technique, consultez Blocage de l'exécution d'applications en mettant fin à une opération asynchrone.
Utilisez le AsyncWaitHandle pour bloquer l'exécution de l'application jusqu'à ce qu'une ou plusieurs opérations soient terminées. Pour obtenir un exemple illustrant cette technique, consultez Blocage de l'exécution d'applications à l'aide d'un AsyncWaitHandle.
Les applications qui n'ont pas besoin de se bloquer pendant que l'opération asynchrone se termine peuvent utiliser l'une des approches suivantes :
Interrogez l'état d'achèvement de l'opération en vérifiant périodiquement la propriété IsCompleted et en appelant EndNomOpération lorsque l'opération est terminée. Pour obtenir un exemple illustrant cette technique, consultez Interrogation de l'état d'une opération asynchrone.
Utilisez un délégué AsyncCallback pour spécifier une méthode à appeler lorsque l'opération est terminée. Pour obtenir un exemple illustrant cette technique, consultez Utilisation d'un délégué AsyncCallback pour terminer une opération asynchrone.
Voir aussi
Concepts
Appel de méthodes synchrones de façon asynchrone
Utilisation d'un délégué AsyncCallback et objet d'état