Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Une opération asynchrone qui utilise le IAsyncResult modèle de conception est implémentée en tant que deux méthodes nommées BeginOperationName
et EndOperationName
qui commencent et terminent respectivement l’opération asynchrone OperationName . Par exemple, la FileStream classe fournit les BeginRead et EndRead méthodes permettant de lire de manière asynchrone des octets à partir d’un fichier. Ces méthodes implémentent la version asynchrone de la Read méthode.
Remarque
À compter de .NET Framework 4, la bibliothèque parallèle de tâches fournit un nouveau modèle pour la programmation asynchrone et parallèle. Pour plus d’informations, consultez Bibliothèque parallèle de tâches (TPL) et Modèle asynchrone basé sur les tâches (TAP)).
Après l’appel BeginOperationName
, une application peut continuer à exécuter des instructions sur le thread appelant pendant que l’opération asynchrone a lieu sur un autre thread. Pour chaque appel à BeginOperationName
, l’application doit également appeler EndOperationName
pour obtenir les résultats de l’opération.
Début d’une opération asynchrone
La BeginOperationName
méthode commence l’opération asynchrone OperationName et retourne un objet qui implémente l’interface IAsyncResult .
IAsyncResult les objets stockent des informations sur une opération asynchrone. Le tableau suivant présente des informations sur une opération asynchrone.
Membre | Descriptif |
---|---|
AsyncState | Objet facultatif spécifique à l’application qui contient des informations sur l’opération asynchrone. |
AsyncWaitHandle | Un élément WaitHandle qui peut être utilisé pour empêcher l’exécution de l’application jusqu’à ce que l’opération asynchrone soit terminée. |
CompletedSynchronously | Valeur qui indique si l’opération asynchrone s’est terminée sur le thread utilisé pour appeler BeginOperationName au lieu de terminer sur un thread distinct ThreadPool . |
IsCompleted | Valeur qui indique si l’opération asynchrone est terminée. |
Une BeginOperationName
méthode accepte tous les paramètres déclarés dans la signature de la version synchrone de la méthode, qu'ils soient passés par valeur ou par référence. Les paramètres out ne font pas partie de la signature de méthode BeginOperationName
. La BeginOperationName
signature de méthode inclut également deux paramètres supplémentaires. La première de ces définitions définit un AsyncCallback délégué 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 une fois l’opération terminée. Le deuxième paramètre supplémentaire est un objet défini par l’utilisateur. Cet objet peut être utilisé pour transmettre des informations d’état spécifiques à l’application à la méthode appelée lorsque l’opération asynchrone se termine. Si une BeginOperationName
méthode accepte des paramètres supplémentaires spécifiques à l'opération, tels qu'un tableau d'octets pour stocker les octets lus à partir d’un fichier, alors AsyncCallback et l'objet d'état de l'application sont les derniers paramètres de la signature de la méthode BeginOperationName
.
BeginOperationName
retourne immédiatement le contrôle au thread appelant. Si la BeginOperationName
méthode lève des exceptions, les exceptions sont levées avant le démarrage de l’opération asynchrone. Si la BeginOperationName
méthode lève des exceptions, la méthode de rappel n’est pas appelée.
Fin d’une opération asynchrone
La EndOperationName
méthode met fin à l’opération asynchrone OperationName. La valeur de retour de la EndOperationName
méthode est le même type retourné par son équivalent synchrone et est spécifique à l’opération asynchrone. Par exemple, la EndRead méthode retourne le nombre d’octets lus à partir d’un FileStream et la EndGetHostByName méthode retourne un IPHostEntry objet qui contient des informations sur un ordinateur hôte. La EndOperationName
méthode prend les paramètres out ou ref déclarés dans la signature de la version synchrone de la méthode. Outre les paramètres de la méthode synchrone, la EndOperationName
méthode inclut également un IAsyncResult paramètre. Les appelants doivent passer l’instance retournée par l’appel correspondant à la méthode BeginOperationName
.
Si l’opération asynchrone représentée par l’objet IAsyncResult n’est pas terminée lorsqu’elle EndOperationName
est appelée, EndOperationName
bloque le thread appelant jusqu’à ce que l’opération asynchrone soit terminée. Les exceptions levées par l’opération asynchrone sont levées à partir de la méthode EndOperationName
. L’effet de l’appel de la EndOperationName
méthode plusieurs fois avec le même IAsyncResult n’est pas défini. 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.
Remarque
Pour l’un ou l’autre des scénarios indéfinis, les implémenteurs doivent envisager de lever InvalidOperationException.
Remarque
Les implémenteurs de ce modèle de conception doivent informer l’appelant que l’opération asynchrone s’est terminée en définissant IsCompleted la valeur true, en appelant la méthode de rappel asynchrone (si elle a été spécifiée) et en signalant le AsyncWaitHandle.
Les développeurs d’applications ont plusieurs choix de conception pour accéder aux résultats de l’opération asynchrone. Le bon choix varie selon que l’application a des instructions qui peuvent s’exécuter pendant la fin de l’opération. Si une application ne peut pas effectuer de travail supplémentaire tant qu’elle ne reçoit pas les résultats de l’opération asynchrone, l’application doit bloquer jusqu’à ce que les résultats soient disponibles. Pour bloquer jusqu’à ce qu’une opération asynchrone se termine, vous pouvez utiliser l’une des approches suivantes :
Appel
EndOperationName
à partir du thread principal de l’application, bloquant 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 de l’application en terminant une opération asynchrone.Utilisez la commande pour bloquer l’exécution AsyncWaitHandle 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’application à l’aide d’un AsyncWaitHandle.
Les applications qui n’ont pas besoin de bloquer pendant que l’opération asynchrone se termine peuvent utiliser l’une des approches suivantes :
Interrogez régulièrement l'état d'achèvement de l'opération en vérifiant la propriété IsCompleted et en appelant
EndOperationName
une fois l'opération terminée. Pour obtenir un exemple illustrant cette technique, consultez Interrogation de l’état d’une opération asynchrone.Utilisez un AsyncCallback délégué pour spécifier une méthode à appeler une fois l’opération terminée. Pour obtenir un exemple illustrant cette technique, consultez Utilisation d’un délégué AsyncCallback pour mettre fin à une opération asynchrone.