Compartilhar via


Como: Receber mensagens de forma assíncrona

Você pode recuperar mensagens assincronamente de duas maneiras: usando um manipulador de eventos para receber notificação quando a operação termina o processamento, ou usando um retorno de chamada.Para obter uma visão geral de sistema de sistema sistema de mensagens assíncrono, consulte mensagem Processamento assíncrono.

Na noticação de eventos, você primeiro ligar um manipulador de eventos o procedimento que você deseja executar quando a telefonar assíncrono for concluída.Você então telefonar o BeginReceive método no seu código. Isso inicia o processamento assíncrono e retorna o processamento para o componente quando uma mensagem se torna disponível ou quando o parâmetro de time limite expira.Quando a telefonar retorna, o sistema executa o delegado que você definiu e processa os resultados da recuperação.Você então telefonar o EndReceive método para indicar o participante da operação.

Observação:

BeginReceive recuperará somente uma única mensagem. Se você desejar continuar o processamento de mensagens de forma assíncrona, você deverá qualquer telefonar a BeginReceive método novamente ou use o parâmetro de retorno de telefonar BeginReceive para chamar um delegado que continuará a procurar novas mensagens que chegam na fila.

Como receber mensagens de forma assíncrona, você pode inspecionar mensagens assincronamente.O padrão para ambos os processos é muito semelhante, exceto que para inspecionar de forma assíncrona, use o BeginPeek método.

Para criar o objeto MessageQueue programaticamente

  1. Adicione uma referência para System.sistema de mensagens.dll ao seu projeto.

  2. Criar uma instância do MessageQueue objeto da classe estão implementando e defina seu Path propriedade (no construtor) e o Formatter propriedade.

    ' 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 criar o objeto MessageQueue no Designer

  1. Adicione uma referência para System.sistema de mensagens.dll ao seu projeto.

  2. From a Caixa de ferramentas, arrastar a MessageQueue componente para o designer. Defina a propriedade QueueName como mq.Defina a propriedade Formatter como XmlMessageFormatter.conjunto o Path propriedade para ". \MyQueue".

Para receber uma mensagem de forma assíncrona usando evento notificação

  1. Crie um manipulador de eventos para o evento ReceiveCompleted.No designer, clicar duas vezes o MessageQueue componente e adicione o código mostrado abaixo.

    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. Escreva código dentro a evento manipulador para recuperar a mensagem, usando o Message objeto para recuperar os resultados da telefonar assíncrono. O código a seguir recupera a mensagem e o exibe no 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 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. telefonar the BeginReceive método em algum lugar no seu código para iniciar a operação assíncrono. Por exemplo, o código a seguir chama o método quando o usuário clica em um botão.

    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. Se você quiser continuar recebendo mensagens de forma assíncrona, chamar o BeginReceive método novamente na ReceiveCompleted manipulador de eventos mostrado abaixo. Isso torna seu componente continue processando sistema autônomo novas mensagens quando estas forem recebidas na fila.

    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 receber uma mensagem de forma assíncrona usando um retorno de chamada

  1. criar uma classe que define as informações relevantes para a tarefa de mensagem.Nesse caso, definir um Customer classe.

    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. Crie uma instância da classe.Este objeto será passado para o método de retorno de chamada.

    Dim george As New Customer("George")
    
             Customer george = new Customer("George");
    
  3. Criar um método de retorno de chamada de acordo com para o AsyncCallback delegado. Esse método irá conter o processamento seja concluído depois que a mensagem for recebida.The AsyncState propriedade das result parâmetro conterá o objeto criado para passar informações sobre a tarefa de mensagem. Nesse caso, a AsyncState é um Customer objeto.

    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. telefonar the BeginReceive método em algum lugar no seu código para iniciar a operação assíncrono. Por exemplo, o código a seguir chama o método quando o usuário clica em um botão.Uma mensagem é enviada para a fila de mensagem e leia da fila.The ReceiveCallback método, definido na etapa 3 acima, é chamado quando a mensagem é recebida.

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

Consulte também

Tarefas

Como: Inspecionar mensagens

Como: Receber mensagens por programação

Como: Criar instâncias de componentes do MessageQueue

Conceitos

mensagem Processamento assíncrono

Outros recursos

Lendo e recebendo mensagens