Traitement des messages asynchrone
Mise à jour : novembre 2007
Vous pouvez récupérer des messages de façon asynchrone si vous souhaitez récupérer des messages sans entraver le traitement de votre application. Dans le traitement des messages asynchrone, la méthode qui démarre une tâche est retournée immédiatement sans attendre un résultat. L'application peut poursuivre l'exécution du travail en cours en attendant que la tâche soit terminée. Au terme de la tâche, le serveur peut avertir l'application de la réussite du traitement du message.
Il existe deux types d'opérations de messagerie asynchrones : la réception de messages asynchrone et la lecture de messages asynchrone. Lorsque vous récupérez un message en mode asynchrone, utilisez les méthodes BeginReceive et EndReceive pour marquer le début et la fin de l'opération. L'opération se déroule comme suit :
La méthode BeginReceive est immédiatement retournée et déclenche un événement appelé ReceiveCompleted lorsqu'un message arrive dans la file d'attente ou si le message que vous lisez ou recevez existe déjà.
L'événement ReceiveCompleted retourne un objet de type IAsyncResult qui contient des informations sur l'opération asynchrone.
Une fois l'événement terminé reçu, vous appelez la méthode EndReceive pour terminer l'opération. Pendant l'appel de fin, vous pouvez accéder au message ou le récupérer en accédant à la classe ReceiveCompletedEventArgs.
Vous pouvez accéder à l'objet IAsyncResult pendant toute la durée de l'opération, mais vous ne l'utilisez généralement pas avant que EndReceive ne soit appelé. Toutefois, si vous lancez plusieurs opérations asynchrones, vous pouvez placer leurs valeurs IAsyncResult dans un tableau et spécifier s'il faut attendre la fin de l'exécution de toutes les opérations ou d'une opération individuelle. Dans ce cas, utilisez la propriété AsyncWaitHandle de l'objet IAsyncResult pour identifier les opérations terminées.
Peek, comme Receive, utilise deux méthodes appelées BeginPeek et EndPeek pour mettre entre crochets le début et fin de l'opération asynchrone. BeginPeek retourne immédiatement et déclenche un événement appelé PeekCompleted lorsqu'un message devient disponible. À l'instar de ReceiveCompleted, cet événement retourne un objet IAsyncResult que vous pouvez manipuler pour obtenir des informations sur l'opération.
En outre, les opérations de lecture et de réception asynchrones peuvent utiliser un délai d'attente pour spécifier combien de temps vous souhaitez attendre l'arrivée d'un message. À cette fin, utilisez une forme surchargée de l'une des deux méthodes pour passer un objet TimeSpan qui indique le temps d'attente. L'événement ReceiveCompleted ou PeekCompleted est déclenché à l'expiration du délai d'attente, mais la propriété IsCompleted de l'objet IAsyncResult a la valeur false pour indiquer qu'un message n'a pas été traité.
Pour plus d'informations sur le traitement asynchrone, consultez les pages suivantes :
Pour obtenir |
Consultez |
---|---|
Des instructions pas à pas sur la réception asynchrone d'un message |
|
Une vue d'ensemble de la méthode BeginPeek et de ses membres |
|
Une vue d'ensemble de la méthode BeginReceive et de ses membres |
Réception d'une notification de l'opération asynchrone
Vous avez le choix entre deux méthodes pour être averti de la réussite de votre opération de lecture ou de réception asynchrone.
Vous pouvez créer un gestionnaire d'événements qui gérera les événements ReceiveCompleted ou PeekCompleted lorsqu'ils se produiront.
Vous pouvez utiliser un rappel pour surveiller automatiquement les messages entrants et passer le traitement à votre application lors de l'arrivée d'un message.
Lorsque vous utilisez la notification d'événement, créez une méthode qui gère le traitement de messages et retourne une notification à la fin du traitement. Appelez ensuite la méthode qui commence le traitement asynchrone. Le système crée automatiquement les gestionnaires d'événements pour vous lorsque vous double-cliquez sur votre composant MessageQueue dans le concepteur.
Remarque : |
---|
Dans le cadre de la notification d'événements, BeginPeek ou BeginReceive retourne un seul message et arrête ensuite le traitement. Vous devez appeler de nouveau BeginPeek ou BeginReceive pour chaque message que vous souhaitez récupérer. |
Pour traiter les messages de façon asynchrone, une autre solution consiste à utiliser un rappel. Un rappel identifie un délégué que vous souhaitez associer à vos opérations BeginPeek ou BeginReceive. Dans ce cas, le délégué continue d'attendre de nouvelles notifications d'événement après que chaque message a été traité.
Voir aussi
Tâches
Comment : recevoir des messages de manière asynchrone
Comment : recevoir des messages par programme