Modèle de programmation asynchroneAsynchronous Programming Model (APM)

Une opération asynchrone qui utilise le modèle de conception 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.An asynchronous operation that uses the IAsyncResult design pattern is implemented as two methods named BeginOperationName and EndOperationName that begin and end the asynchronous operation OperationName respectively. Par exemple, la classe FileStream fournit les méthodes BeginRead et EndRead pour lire les octets d’un fichier de façon asynchrone.For example, the FileStream class provides the BeginRead and EndRead methods to asynchronously read bytes from a file. Ces méthodes implémentent la version asynchrone de la méthode Read .These methods implement the asynchronous version of the Read method.

Notes

À compter du .NET Framework 4, la bibliothèque parallèle de tâches propose un nouveau modèle pour la programmation asynchrone et parallèle.Starting with the .NET Framework 4, the Task Parallel Library provides a new model for asynchronous and parallel programming. Pour plus d’informations, consultez Task Parallel Library (TPL) et Task-based Asynchronous Pattern (TAP).For more information, see Task Parallel Library (TPL) and Task-based Asynchronous Pattern (TAP)).

Après avoir appelé la méthode BeginOperationName, une application peut continuer à exécuter les instructions sur le thread appelant pendant que l’opération asynchrone s’exécute sur un autre thread.After calling BeginOperationName, an application can continue executing instructions on the calling thread while the asynchronous operation takes place on a different thread. Pour chaque appel de la méthode BeginOperationName, l’application doit également appeler la méthode EndOperationName afin d’obtenir les résultats de l’opération.For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation.

Commencement d’une opération asynchroneBeginning an Asynchronous Operation

La méthode BeginOperationName commence l’opération asynchrone OperationName et retourne un objet qui implémente l’interface IAsyncResult.The BeginOperationName method begins asynchronous operation OperationName and returns an object that implements the IAsyncResult interface. Les objetsIAsyncResult stockent des informations sur une opération asynchrone.IAsyncResult objects store information about an asynchronous operation. Le tableau suivant affiche des informations sur une opération asynchrone.The following table shows information about an asynchronous operation.

MembreMember DescriptionDescription
AsyncState Objet spécifique à l'application facultatif qui contient les informations sur l'opération asynchrone.An optional application-specific object that contains information about the asynchronous operation.
AsyncWaitHandle WaitHandle qui peut être utilisé pour bloquer l’exécution de l’application jusqu’à ce que l’opération asynchrone se termine.A WaitHandle that can be used to block application execution until the asynchronous operation completes.
CompletedSynchronously Valeur qui indique si l’opération asynchrone s’est terminée sur le thread utilisé pour appeler la méthode BeginOperationName plutôt que sur un thread ThreadPool séparé.A value that indicates whether the asynchronous operation completed on the thread used to call BeginOperationName instead of completing on a separate ThreadPool thread.
IsCompleted Valeur qui indique si l’opération asynchrone est terminée.A value that indicates whether the asynchronous operation has completed.

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.A BeginOperationName method takes any parameters declared in the signature of the synchronous version of the method that are passed by value or by reference. Aucun des paramètres out ne fait partie de la signature de méthode BeginOperationName.Any out parameters are not part of the BeginOperationName method signature. La signature de méthode BeginOperationName inclut également deux paramètres supplémentaires.The BeginOperationName method signature also includes two additional parameters. Le premier définit un délégué AsyncCallback qui fait référence à une méthode appelée à la fin de l’opération asynchrone.The first of these defines an AsyncCallback delegate that references a method that is called when the asynchronous operation completes. L’appelant peut spécifier null (Nothing en Visual Basic) s’il ne veut pas qu’une méthode soit appelée à la fin de l’opération.The caller can specify null (Nothing in Visual Basic) if it does not want a method invoked when the operation completes. Le deuxième paramètre supplémentaire est un objet défini par l’utilisateur.The second additional parameter is a user-defined object. Cet objet peut être utilisé pour passer des informations d’état spécifiques à l’application à la méthode appelée à la fin de l’opération asynchrone.This object can be used to pass application-specific state information to the method invoked when the asynchronous operation completes. 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, le AsyncCallback et l’objet d’état de l’application sont les derniers paramètres dans la signature de méthode BeginOperationName.If a BeginOperationName method takes additional operation-specific parameters, such as a byte array to store bytes read from a file, the AsyncCallback and application state object are the last parameters in the BeginOperationName method signature.

BeginOperationName retourne immédiatement le contrôle au thread appelant.BeginOperationName returns control to the calling thread immediately. Si la méthode BeginOperationName lève des exceptions, celles-ci le sont avant le lancement de l’opération asynchrone.If the BeginOperationName method throws exceptions, the exceptions are thrown before the asynchronous operation is started. Si la méthode BeginOperationName lève des exceptions, la méthode de rappel n’est pas appelée.If the BeginOperationName method throws exceptions, the callback method is not invoked.

Fin d’une opération asynchroneEnding an Asynchronous Operation

La méthode EndOperationName met fin à l’opération asynchrone OperationName.The EndOperationName method ends asynchronous operation OperationName. La valeur de retour de la méthode EndOperationName est de type identique à celui retourné par son équivalent synchrone et est spécifique à l’opération asynchrone.The return value of the EndOperationName method is the same type returned by its synchronous counterpart and is specific to the asynchronous operation. 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 qui contient des informations sur un ordinateur hôte.For example, the EndRead method returns the number of bytes read from a FileStream and the EndGetHostByName method returns an IPHostEntry object that contains information about a host computer. La méthode EndOperationName accepte tout paramètre out ou ref déclaré dans la signature de la version synchrone de la méthode.The EndOperationName method takes any out or ref parameters declared in the signature of the synchronous version of the method. Outre les paramètres de la méthode synchrone, la méthode EndOperationName inclut également un paramètre IAsyncResult.In addition to the parameters from the synchronous method, the EndOperationName method also includes an IAsyncResult parameter. Les appelants doivent passer l’instance retournée par l’appel correspondant à la méthode BeginOperationName.Callers must pass the instance returned by the corresponding call to BeginOperationName.

Si l’opération asynchrone représentée par l’objet IAsyncResult n’est pas terminée quand la méthode EndOperationName est appelée, la méthode EndOperationName bloque le thread appelant jusqu’à la fin de l’opération asynchrone.If the asynchronous operation represented by the IAsyncResult object has not completed when EndOperationName is called, EndOperationName blocks the calling thread until the asynchronous operation is complete. Les exceptions levées par l’opération asynchrone sont levées à partir de la méthode EndOperationName.Exceptions thrown by the asynchronous operation are thrown from the EndOperationName method. Les conséquences de plusieurs appels à la méthode EndOperationName avec le même IAsyncResult ne sont pas définies.The effect of calling the EndOperationName method multiple times with the same IAsyncResult is not defined. 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.Likewise, calling the EndOperationName method with an IAsyncResult that was not returned by the related Begin method is also not defined.

Notes

Pour l’un ou l’autre des scénarios indéfinis, les implémenteurs doivent envisager de lever InvalidOperationException.For either of the undefined scenarios, implementers should consider throwing InvalidOperationException.

Notes

Les implémenteurs de ce modèle de conception doivent informer l’appelant que l’opération asynchrone s’est terminée en attribuant à IsCompleted la valeur true, en appelant la méthode de rappel asynchrone (s’il en été spécifiée une) et en signalant AsyncWaitHandle.Implementers of this design pattern should notify the caller that the asynchronous operation completed by setting IsCompleted to true, calling the asynchronous callback method (if one was specified) and signaling the AsyncWaitHandle.

Plusieurs options de conception s’offrent aux développeurs d’applications pour ce qui est de l’accès aux résultats de l’opération asynchrone.Application developers have several design choices for accessing the results of the asynchronous operation. L’option appropriée varie selon que l’application peut exécuter ou non des instructions pendant que l’opération se termine.The correct choice depends on whether the application has instructions that can execute while the operation completes. Si une application ne peut pas effectuer de tâches supplémentaires tant qu’elle n’a pas reçu les résultats de l’opération asynchrone, l’application doit être bloquée en attendant que les résultats soient disponibles.If an application cannot perform any additional work until it receives the results of the asynchronous operation, the application must block until the results are available. Pour la bloquer en attendant la fin de l’opération asynchrone, vous pouvez utiliser l’une des approches suivantes :To block until an asynchronous operation completes, you can use one of the following approaches:

Les applications qui ne doivent pas être bloquées pendant que l’opération se termine peuvent utiliser l’une des approches suivantes :Applications that do not need to block while the asynchronous operation completes can use one of the following approaches:

Voir aussiSee also