Remarque
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.
Mise à jour : novembre 2007
Vous pouvez récupérer des messages en mode asynchrone de deux façons : en utilisant un gestionnaire d'événements pour être notifié de la fin du traitement d'une opération ou en recourant à un rappel. Pour une vue d'ensemble de la messagerie asynchrone, consultez Traitement des messages asynchrone.
Dans le cadre de la notification d'événement, commencez par lier un gestionnaire d'événements à la procédure que vous souhaitez exécuter lorsque l'appel asynchrone est terminé. Ensuite, appelez la méthode BeginReceive dans votre code. Le système lance alors le traitement asynchrone et retourne le traitement à votre composant lors de l'arrivée d'un message ou de l'expiration du paramètre d'attente. Lorsque l'appel est retourné, le système exécute le délégué que vous avez défini et traite les résultats de la récupération. Appelez ensuite la méthode EndReceive pour indiquer la fin de l'opération.
Remarque : |
|---|
BeginReceive ne récupère qu'un seul message. Si vous souhaitez poursuivre le traitement asynchrone des messages, vous devez soit appeler de nouveau la méthode BeginReceive, soit utiliser le paramètre de rappel sur BeginReceive pour appeler un délégué qui continue d'attendre l'arrivée de nouveaux messages dans la file d'attente. |
Vous pouvez non seulement recevoir des messages en mode asynchrone, mais également lire des messages en mode asynchrone. Le modèle d'exécution des deux processus est très similaire si ce n'est que, pour lire en mode asynchrone, vous utilisez la méthode BeginPeek.
Pour créer l'objet MessageQueue par programme
Ajoutez à votre projet une référence à System.Messaging.dll.
Créez une instance de l'objet MessageQueue dans la classe que vous implémentez et définissez sa propriété Path (dans le constructeur), ainsi que la propriété Formatter.
' Add this to the constructor Dim targetTypeNames() As String = _ New String() {"System.String,mscorlib"} mq.Formatter = _ New System.Messaging.XmlMessageFormatter(targetTypeNames)// Add this to the class declarations. System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(".\\MyQueue"); // Add this to the constructor. mq.Formatter = new System.Messaging.XmlMessageFormatter( new string[] { "System.String,mscorlib" });
Pour créer l'objet MessageQueue dans le concepteur
Ajoutez à votre projet une référence à System.Messaging.dll.
À partir de la Boîte à outils, faites glisser un composant MessageQueue dans le concepteur. Affectez à la propriété QueueName la valeur mq. Affectez à la propriété Formatter la valeur XmlMessageFormatter. Affectez à la propriété Path la valeur ".\MyQueue".
Pour recevoir un message en mode asynchrone à l'aide de la notification d'événement
Créez un gestionnaire d'événements pour l'événement ReceiveCompleted. Dans le concepteur, double-cliquez sur le composant MessageQueue et ajoutez le code indiqué ci-dessous.
Private Sub mq_ReceiveCompleted(ByVal sender As System.Object, _ ByVal e As System.Messaging.ReceiveCompletedEventArgs) _ Handles mq.ReceiveCompleted ' Add code here to respond to message. End Subprivate void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { // Add code here to respond to message. }Écrivez le code dans le gestionnaire d'événements pour récupérer le message, en utilisant l'objet Message pour récupérer les résultats de l'appel asynchrone. Le code ci-dessous récupère le message et l'affiche sur la console.
Private Sub mq_ReceiveCompleted(ByVal sender As System.Object, _ ByVal e As System.Messaging.ReceiveCompletedEventArgs) _ Handles mq.ReceiveCompleted Dim m As System.Messaging.Message = mq.EndReceive(e.AsyncResult) m.Formatter = New System.Messaging.XmlMessageFormatter( _ New String() {"System.String,mscorlib"}) Console.WriteLine("Message: " + m.Body.ToString()) End Subprivate void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { System.Messaging.Message m = mq.EndReceive(e.AsyncResult); m.Formatter = new System.Messaging.XmlMessageFormatter( new string[] { "System.String,mscorlib" }); Console.WriteLine("Message: " + (string)m.Body); }Appelez la méthode BeginReceive à un endroit du code afin de lancer l'opération asynchrone. Par exemple, le code ci-dessous appelle la méthode lorsque l'utilisateur clique sur un bouton.
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click mq.BeginReceive() End Subprivate void button1_Click(object sender, System.EventArgs e) { mq.BeginReceive(); }Pour continuer à recevoir des messages en mode asynchrone, appelez de nouveau la méthode BeginReceive dans le gestionnaire d'événements ReceiveCompleted, comme indiqué ci-dessous. Ainsi, votre composant continue à traiter les nouveaux messages à mesure qu'ils arrivent dans la file d'attente.
Private Sub mq_ReceiveCompleted(ByVal sender As System.Object, _ ByVal e As System.Messaging.ReceiveCompletedEventArgs) _ Handles mq.ReceiveCompleted Dim m As System.Messaging.Message = mq.EndReceive(e.AsyncResult) m.Formatter = New System.Messaging.XmlMessageFormatter( _ New String() {"System.String,mscorlib"}) Console.WriteLine("Message: " + m.Body.ToString()) mq.BeginReceive() End Subprivate void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { System.Messaging.Message m = mq.EndReceive(e.AsyncResult); m.Formatter = new System.Messaging.XmlMessageFormatter( new string[] { "System.String,mscorlib" }); Console.WriteLine("Message: " + (string)m.Body); mq.BeginReceive(); }
Pour recevoir un message en mode asynchrone à l'aide d'un rappel
Créez une classe définissant les informations concernant la tâche relative au message. Dans ce cas, définissez une classe Customer.
Public Class Customer Public Name As String = "" Public Sub New(ByVal newName As String) Name = newName End Sub End Classpublic class Customer { public string Name = ""; public Customer(string name) { Name = name; } }Créez une instance de la classe. Cet objet sera passé à la méthode de rappel.
Dim george As New Customer("George")Customer george = new Customer("George");Créez une méthode de rappel en fonction du délégué AsyncCallback. Cette méthode comprendra le traitement à réaliser une fois le message reçu. La propriété AsyncState du paramètre result contiendra l'objet créé pour passer les informations sur la tâche relative au message. Dans ce cas, AsyncState est un objet Customer.
Private Sub ReceiveCallback(ByVal result As System.IAsyncResult) Dim buyer As Customer = CType(result.AsyncState, Customer) Dim buyerName As String = buyer.Name End Subprivate void ReceiveCallback(System.IAsyncResult result) { Customer buyer = (Customer)result.AsyncState; string buyerName = buyer.Name; }Appelez la méthode BeginReceive à un endroit du code afin de lancer l'opération asynchrone. Par exemple, le code ci-dessous appelle la méthode lorsque l'utilisateur clique sur un bouton. Un message est envoyé à la file d'attente de messages, puis est lu à partir de cette file d'attente. La méthode ReceiveCallback, définie à l'étape 3 ci-dessus, est appelée à la réception du message.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click MessageQueue1.Send("Buy six eggs.", george.Name) MessageQueue1.BeginReceive(New System.TimeSpan(0, 0, 5), george, _ AddressOf ReceiveCallback) End Subprivate void button1_Click(object sender, System.EventArgs e) { messageQueue1.Send("Buy six eggs.", george.Name); messageQueue1.BeginReceive(new System.TimeSpan(0, 0, 5), george, new System.AsyncCallback(this.ReceiveCallback)); }
Voir aussi
Tâches
Comment : recevoir des messages par programme
Comment : créer des instances du composant MessageQueue
Concepts
Traitement des messages asynchrone
Remarque :