Compartir a través de


Cómo: Recibir mensajes de forma asincrónica

Actualización: noviembre 2007

Puede recuperar mensajes asincrónicamente de dos formas diferentes: mediante el uso de un controlador de eventos que reciba una notificación cuando termine el procesamiento de la operación o mediante el uso de una devolución de llamada. Para obtener información general sobre mensajería asincrónica, vea Procesamiento asincrónico de mensajes.

En la notificación de eventos, primero se enlaza un controlador de eventos al procedimiento que se desea ejecutar una vez que finaliza la llamada asincrónica. A continuación, se llama al método BeginReceive en el código. De este modo se inicia el procesamiento asincrónico y se devuelve el procesamiento al componente cuando hay un mensaje disponible o cuando caduca el parámetro de tiempo de espera. Cuando retorna la llamada, el sistema ejecuta el delegado definido y procesa los resultados de la recuperación. Por último, se llama al método EndReceive para indicar el final de la operación.

Nota:

BeginReceive únicamente recuperará un mensaje. Si desea continuar con el procesamiento asincrónico de mensajes, deberá llamar de nuevo al método BeginReceive o utilizar el parámetro de devolución de llamada de BeginReceive para llamar a un delegado que continuará inspeccionando los mensajes nuevos que lleguen a la cola.

Además de recibir mensajes de forma asincrónica, puede ejecutar el método Peek en los mensajes de forma asincrónica. El modelo para ambos procesos es muy similar, salvo que para ejecutar el método Peek de forma asincrónica, debe utilizarse el método BeginPeek.

Para crear el objeto MessageQueue mediante programación

  1. Agregue al proyecto una referencia a System.Messaging.dll.

  2. Cree una instancia del objeto MessageQueue en la clase que va a implementar y defina su propiedad Path (en el constructor) y la propiedad 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" });
    

Para crear el objeto MessageQueue en el diseñador

  1. Agregue al proyecto una referencia a System.Messaging.dll.

  2. En el Cuadro de herramientas, arrastre un control MessageQueue hasta el diseñador. Establezca la propiedad QueueName en mq. Establezca la propiedad Formatter en XmlMessageFormatter. Establezca la propiedad Path en ".\MyQueue".

Para recibir un mensaje de forma asincrónica mediante la notificación de eventos

  1. Cree un controlador de eventos para el evento ReceiveCompleted. En el diseñador, haga doble clic en el componente MessageQueue y agregue el código que se muestra a continuación.

    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 Sub
    
         private void mq_ReceiveCompleted(object sender,
            System.Messaging.ReceiveCompletedEventArgs e)
            {
                // Add code here to respond to message.
            }
    
  2. Escriba código en el controlador de eventos para recuperar el mensaje y utilice el objeto Message para recuperar los resultados de la llamada asincrónica. El siguiente código recupera el mensaje y lo muestra en la consola.

    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 Sub
    
     private 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);
        }
    
  3. Llame al método BeginReceive en algún punto del código para iniciar la operación asincrónica. Por ejemplo, el siguiente código llama al método cuando el usuario hace clic en un botón.

    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
        mq.BeginReceive()
    End Sub
    
     private void button1_Click(object sender, System.EventArgs e)
        {
            mq.BeginReceive();
        }
    
  4. Si desea continuar recibiendo mensajes de manera asincrónica, llame de nuevo al método BeginReceive en el controlador de eventos ReceiveCompleted, como se muestra a continuación. Esto hace que el componente continúe procesando mensajes nuevos a medida que se reciben en la cola.

    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 Sub
    
         private 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();
            }
    

Para recibir un mensaje de forma asincrónica utilizando una devolución de llamada

  1. Cree una clase que defina información relevante para la tarea de mensaje. En este caso, defina una clase Customer.

    Public Class Customer
        Public Name As String = ""
        Public Sub New(ByVal newName As String)
            Name = newName
        End Sub
    End Class
    
     public class Customer
        {
            public string Name = "";
            public Customer(string name)
            {
                Name = name;
            }
        }
    
  2. Cree una instancia de la clase. Este objeto se pasará al método de devolución de llamada.

    Dim george As New Customer("George")
    
             Customer george = new Customer("George");
    
  3. Cree un método de devolución de llamada en función del delegado AsyncCallback. Este método contendrá el procesamiento que se deberá llevar a cabo después de recibir el mensaje. La propiedad AsyncState del parámetro result contendrá el objeto que creó para transferir información sobre la tarea de mensaje. En este caso, AsyncState es un objeto Customer.

    Private Sub ReceiveCallback(ByVal result As System.IAsyncResult)
        Dim buyer As Customer = CType(result.AsyncState, Customer)
        Dim buyerName As String = buyer.Name
    End Sub
    
         private void ReceiveCallback(System.IAsyncResult result)
            {
                Customer buyer = (Customer)result.AsyncState;
                string buyerName = buyer.Name;
            }
    
  4. Llame al método BeginReceive en algún punto del código para iniciar la operación asincrónica. Por ejemplo, el siguiente código llama al método cuando el usuario hace clic en un botón. Se envía un mensaje a la cola de mensajes y después se lee de la cola. Cuando se recibe el mensaje, se llama al método ReceiveCallback, definido en el paso 3.

    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 Sub
    
         private 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));
            }
    

Vea también

Tareas

Cómo: Ejecutar el método Peek en los mensajes

Cómo: Recibir mensajes mediante programación

Cómo: Crear instancias de componentes MessageQueue

Conceptos

Procesamiento asincrónico de mensajes

Otros recursos

Leer y recibir mensajes