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 BeginOperationName et EndOperationName qui commencent et terminent respectivement l'opération asynchrone OperationName. 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é BeginOperationName, 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 à BeginOperationName, l'application doit également appeler EndOperationName afin d'obtenir les résultats de l'opération.
Début d'une opération asynchrone
La méthode BeginOperationName commence l'opération asynchrone OperationName et retourne un objet qui implémente l'interface IAsyncResult. Les objets IAsyncResult stockent les informations relatives à 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 BeginOperationName plutôt que sur un thread ThreadPool séparé. |
|
Valeur indiquant si l'opération asynchrone est terminée. |
Une méthode BeginOperationName 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 BeginOperationName. La signature de méthode BeginOperationName 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 BeginOperationName 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 BeginOperationName.
Begin (début) OperationName retourne immédiatement le contrôle au thread appelant. Si la méthode BeginOperationName lève des exceptions, les exceptions sont levées avant le lancement de l'opération asynchrone. Si la méthode BeginOperationName lève des exceptions, la méthode de rappel n'est pas appelée.
Fin d'une opération asynchrone
La méthode EndOperationName termine l'opération asynchrone OperationName. La valeur de retour de la méthode EndOperationName 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 EndOperationName 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 EndOperationName inclut également un paramètre IAsyncResult. Les appelants doivent passer l'instance retournée par l'appel correspondant à BeginOperationName.
Si l'opération asynchrone représentée par l'objet IAsyncResult n'est pas terminée lorsque la méthode EndOperationName est appelée, EndOperationName 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 EndOperationName. Les conséquences de plusieurs appels à la méthode EndOperationName avec le même IAsyncResult ne sont pas définies. De même, l'appel de la méthode EndOperationName avec un IAsyncResult qui n'a pas été retourné par la méthode Begin associée n'est pas non plus défini.
Notes
Pour l'un ou l'autre de ces scénarios indéfinis, les implémenteurs doivent envisager la levée d'une InvalidOperationException.
Notes
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 EndOperationName à 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 EndOperationName 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