Partager via


Modèle de programmation asynchrone (APM)

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 :

Les applications qui n’ont pas besoin de bloquer pendant que l’opération asynchrone se termine peuvent utiliser l’une des approches suivantes :

Voir aussi