Condividi tramite


MessageQueue.Receive Metodo

Definizione

Riceve il primo messaggio della coda rimuovendolo da quest'ultima.

Overload

Receive()

Riceve il primo messaggio disponibile nella coda a cui MessageQueue fa riferimento. Questa chiamata è sincrona e blocca il thread corrente di esecuzione finché non è disponibile un messaggio.

Receive(MessageQueueTransaction)

Riceve il primo messaggio disponibile nella coda transazionale a cui MessageQueue fa riferimento. Questa chiamata è sincrona e blocca il thread corrente di esecuzione finché non è disponibile un messaggio.

Receive(MessageQueueTransactionType)

Riceve il primo messaggio disponibile nella coda a cui MessageQueue fa riferimento. Questa chiamata è sincrona e blocca il thread corrente di esecuzione finché non è disponibile un messaggio.

Receive(TimeSpan)

Riceve il primo messaggio disponibile nella coda cui l'oggetto MessageQueue fa riferimento e attende che un messaggio sia disponibile nella coda o che il timeout scada.

Receive(TimeSpan, Cursor)

Riceve il messaggio corrente nella coda, utilizzando il cursore specificato. Se non è disponibile alcun messaggio, il metodo aspetta finché non risulta disponibile un messaggio o finché non scade il periodo di timeout.

Receive(TimeSpan, MessageQueueTransaction)

Riceve il primo messaggio disponibile nella coda transazionale cui l'oggetto MessageQueue fa riferimento e attende che un messaggio sia disponibile nella coda o che il timeout scada.

Receive(TimeSpan, MessageQueueTransactionType)

Riceve il primo messaggio disponibile nella coda a cui MessageQueue fa riferimento. Questa chiamata è sincrona e attende che un messaggio venga reso disponibile nella coda o il timeout scada.

Receive(TimeSpan, Cursor, MessageQueueTransaction)

Riceve il messaggio corrente nella coda, utilizzando il cursore specificato. Se non è disponibile alcun messaggio, il metodo aspetta finché non risulta disponibile un messaggio o finché non scade il periodo di timeout.

Receive(TimeSpan, Cursor, MessageQueueTransactionType)

Riceve il messaggio corrente nella coda, utilizzando il cursore specificato. Se non è disponibile alcun messaggio, il metodo aspetta finché non risulta disponibile un messaggio o finché non scade il periodo di timeout.

Receive()

Riceve il primo messaggio disponibile nella coda a cui MessageQueue fa riferimento. Questa chiamata è sincrona e blocca il thread corrente di esecuzione finché non è disponibile un messaggio.

public:
 System::Messaging::Message ^ Receive();
public System.Messaging.Message Receive ();
member this.Receive : unit -> System.Messaging.Message
Public Function Receive () As Message

Restituisce

Oggetto Message che fa riferimento al primo messaggio disponibile nella coda.

Eccezioni

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Esempio

Nell'esempio di codice seguente viene ricevuto un messaggio da una coda e vengono restituite informazioni sul messaggio sullo schermo.

#using <system.dll>
#using <system.messaging.dll>

using namespace System;
using namespace System::Messaging;

// This class represents an object the following example 
// sends to a queue and receives from a queue.
ref class Order
{
public:
   int orderId;
   DateTime orderTime;
};


/// <summary>
/// Provides a container class for the example.
/// </summary>
ref class MyNewQueue
{
public:

   //*************************************************
   // Sends an Order to a queue.
   //*************************************************
   void SendMessage()
   {
      // Create a new order and set values.
      Order^ sentOrder = gcnew Order;
      sentOrder->orderId = 3;
      sentOrder->orderTime = DateTime::Now;

      // Connect to a queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );

      // Send the Order to the queue.
      myQueue->Send( sentOrder );
      return;
   }

   //*************************************************
   // Receives a message containing an Order.
   //*************************************************
   void ReceiveMessage()
   {
      // Connect to the a queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );

      // Set the formatter to indicate body contains an Order.
      array<Type^>^p = gcnew array<Type^>(1);
      p[ 0 ] = Order::typeid;
      myQueue->Formatter = gcnew XmlMessageFormatter( p );
      try
      {
         // Receive and format the message. 
         Message^ myMessage = myQueue->Receive();
         Order^ myOrder = static_cast<Order^>(myMessage->Body);

         // Display message information.
         Console::WriteLine( "Order ID: {0}", myOrder->orderId );
         Console::WriteLine( "Sent: {0}", myOrder->orderTime );
      }
      catch ( MessageQueueException^ ) 
      {
         // Handle Message Queuing exceptions.
      }
      // Handle invalid serialization format.
      catch ( InvalidOperationException^ e ) 
      {
         Console::WriteLine( e->Message );
      }

      // Catch other exceptions as necessary.
      return;
   }
};

//*************************************************
// Provides an entry point into the application.
//         
// This example sends and receives a message from
// a queue.
//*************************************************
int main()
{
   // Create a new instance of the class.
   MyNewQueue^ myNewQueue = gcnew MyNewQueue;

   // Send a message to a queue.
   myNewQueue->SendMessage();

   // Receive a message from a queue.
   myNewQueue->ReceiveMessage();
   return 0;
}
using System;
using System.Messaging;

namespace MyProject
{

    // This class represents an object the following example
    // sends to a queue and receives from a queue.
    public class Order
    {
        public int orderId;
        public DateTime orderTime;
    };	

    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {

        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example sends and receives a message from
        // a queue.
        //**************************************************

        public static void Main()
        {
            // Create a new instance of the class.
            MyNewQueue myNewQueue = new MyNewQueue();

            // Send a message to a queue.
            myNewQueue.SendMessage();

            // Receive a message from a queue.
            myNewQueue.ReceiveMessage();

            return;
        }

        //**************************************************
        // Sends an Order to a queue.
        //**************************************************
        
        public void SendMessage()
        {
            
            // Create a new order and set values.
            Order sentOrder = new Order();
            sentOrder.orderId = 3;
            sentOrder.orderTime = DateTime.Now;

            // Connect to a queue on the local computer.
            MessageQueue myQueue = new MessageQueue(".\\myQueue");

            // Send the Order to the queue.
            myQueue.Send(sentOrder);

            return;
        }

        //**************************************************
        // Receives a message containing an Order.
        //**************************************************
        
        public  void ReceiveMessage()
        {
            // Connect to the a queue on the local computer.
            MessageQueue myQueue = new MessageQueue(".\\myQueue");

            // Set the formatter to indicate body contains an Order.
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(MyProject.Order)});
            
            try
            {
                // Receive and format the message.
                Message myMessage =	myQueue.Receive();
                Order myOrder = (Order)myMessage.Body;

                // Display message information.
                Console.WriteLine("Order ID: " +
                    myOrder.orderId.ToString());
                Console.WriteLine("Sent: " +
                    myOrder.orderTime.ToString());
            }
            
            catch (MessageQueueException)
            {
                // Handle Message Queuing exceptions.
            }

            // Handle invalid serialization format.
            catch (InvalidOperationException e)
            {
                Console.WriteLine(e.Message);
            }
            
            // Catch other exceptions as necessary.

            return;
        }
    }
}
Imports System.Messaging

    ' This class represents an object the following example 
    ' sends to a queue and receives from a queue.
    Public Class Order
        Public orderId As Integer
        Public orderTime As DateTime
    End Class


   
    Public Class MyNewQueue


        '
        ' Provides an entry point into the application.
        '		 
        ' This example sends and receives a message from
        ' a qeue.
        '

        Public Shared Sub Main()

            ' Create a new instance of the class.
            Dim myNewQueue As New MyNewQueue()

            ' Send a message to a queue.
            myNewQueue.SendMessage()

            ' Receive a message from a queue.
            myNewQueue.ReceiveMessage()

            Return

        End Sub


        '
        ' Sends an Order to a queue.
        '

        Public Sub SendMessage()

            ' Create a new order and set values.
            Dim sentOrder As New Order()
            sentOrder.orderId = 3
            sentOrder.orderTime = DateTime.Now

            ' Connect to a queue on the local computer.
            Dim myQueue As New MessageQueue(".\myQueue")

            ' Send the Order to the queue.
            myQueue.Send(sentOrder)

            Return

        End Sub


        '
        ' Receives a message containing an Order.
        '

        Public Sub ReceiveMessage()

            ' Connect to the a queue on the local computer.
            Dim myQueue As New MessageQueue(".\myQueue")

            ' Set the formatter to indicate the body contains an Order.
            myQueue.Formatter = New XmlMessageFormatter(New Type() _
                {GetType(Order)})

            Try

                ' Receive and format the message. 
                Dim myMessage As Message = myQueue.Receive()
                Dim myOrder As Order = CType(myMessage.Body, Order)

                ' Display message information.
                Console.WriteLine(("Order ID: " + _
                    myOrder.orderId.ToString()))
                Console.WriteLine(("Sent: " + _
                    myOrder.orderTime.ToString()))

            Catch m As MessageQueueException
                ' Handle Message Queuing exceptions.

            Catch e As InvalidOperationException
                ' Handle invalid serialization format.
                Console.WriteLine(e.Message)


                ' Catch other exceptions as necessary.

            End Try

            Return

        End Sub

End Class

Commenti

Usare questo overload per ricevere un messaggio da una coda o attendere fino a quando non sono presenti messaggi nella coda.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendolo dalla coda. Le chiamate successive a Receive restituiranno i messaggi che seguono nella coda o nuovi messaggi con priorità più alta.

Per leggere il primo messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Il Peek metodo restituisce sempre il primo messaggio nella coda, quindi le chiamate successive al metodo restituiscono lo stesso messaggio a meno che non arrivi un messaggio con priorità più alta nella coda.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Poiché questo overload del Receive metodo specifica un timeout infinito, l'applicazione potrebbe attendere per un periodo illimitato. Se l'elaborazione dell'applicazione deve continuare senza attendere il messaggio, provare a usare il metodo asincrono . BeginReceive

Nella tabella seguente viene illustrato se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Computer locale e nome del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Receive(MessageQueueTransaction)

Riceve il primo messaggio disponibile nella coda transazionale a cui MessageQueue fa riferimento. Questa chiamata è sincrona e blocca il thread corrente di esecuzione finché non è disponibile un messaggio.

public:
 System::Messaging::Message ^ Receive(System::Messaging::MessageQueueTransaction ^ transaction);
public System.Messaging.Message Receive (System.Messaging.MessageQueueTransaction transaction);
member this.Receive : System.Messaging.MessageQueueTransaction -> System.Messaging.Message
Public Function Receive (transaction As MessageQueueTransaction) As Message

Parametri

Restituisce

Oggetto Message che fa riferimento al primo messaggio disponibile nella coda.

Eccezioni

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

-oppure-

La coda non è transazionale.

Esempio

L'esempio di codice seguente si connette a una coda transazionale nel computer locale e invia un messaggio alla coda. Riceve quindi il messaggio che contiene un ordine. Se rileva una coda non transazionale, genererà un'eccezione e eseguirà il rollback della transazione.

#using <system.dll>
#using <system.messaging.dll>

using namespace System;
using namespace System::Messaging;

/// <summary>
/// Provides a container class for the example.
/// </summary>
ref class MyNewQueue
{
public:

   //*************************************************
   // Sends a message to a queue.
   //*************************************************
   void SendMessageTransactional()
   {
      // Connect to a queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myTransactionalQueue" );

      // Send a message to the queue.
      if ( myQueue->Transactional == true )
      {
         // Create a transaction.
         MessageQueueTransaction^ myTransaction = gcnew MessageQueueTransaction;

         // Begin the transaction.
         myTransaction->Begin();

         // Send the message.
         myQueue->Send( "My Message Data.", myTransaction );

         // Commit the transaction.
         myTransaction->Commit();
      }

      return;
   }


   //*************************************************
   // Receives a message containing an Order.
   //*************************************************
   void ReceiveMessageTransactional()
   {
      // Connect to a transactional queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myTransactionalQueue" );

      // Set the formatter.
      array<Type^>^p = gcnew array<Type^>(1);
      p[ 0 ] = String::typeid;
      myQueue->Formatter = gcnew XmlMessageFormatter( p );

      // Create a transaction.
      MessageQueueTransaction^ myTransaction = gcnew MessageQueueTransaction;
      try
      {
         // Begin the transaction.
         myTransaction->Begin();

         // Receive the message. 
         Message^ myMessage = myQueue->Receive( myTransaction );
         String^ myOrder = static_cast<String^>(myMessage->Body);

         // Display message information.
         Console::WriteLine( myOrder );

         // Commit the transaction.
         myTransaction->Commit();
      }
      catch ( MessageQueueException^ e ) 
      {
         // Handle nontransactional queues.
         if ( e->MessageQueueErrorCode == MessageQueueErrorCode::TransactionUsage )
         {
            Console::WriteLine( "Queue is not transactional." );
         }

         // Else catch other sources of a MessageQueueException.
         // Roll back the transaction.
         myTransaction->Abort();
      }

      // Catch other exceptions as necessary, such as 
      // InvalidOperationException, thrown when the formatter 
      // cannot deserialize the message.
      return;
   }
};

//*************************************************
// Provides an entry point into the application.
// 
// This example sends and receives a message from
// a transactional queue.
//*************************************************
int main()
{
   // Create a new instance of the class.
   MyNewQueue^ myNewQueue = gcnew MyNewQueue;

   // Send a message to a queue.
   myNewQueue->SendMessageTransactional();

   // Receive a message from a queue.
   myNewQueue->ReceiveMessageTransactional();
   return 0;
}
using System;
using System.Messaging;

namespace MyProject
{

    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {

        //**************************************************
        // Provides an entry point into the application.
        //
        // This example sends and receives a message from
        // a transactional queue.
        //**************************************************

        public static void Main()
        {
            // Create a new instance of the class.
            MyNewQueue myNewQueue = new MyNewQueue();

            // Send a message to a queue.
            myNewQueue.SendMessageTransactional();

            // Receive a message from a queue.
            myNewQueue.ReceiveMessageTransactional();

            return;
        }

        //**************************************************
        // Sends a message to a queue.
        //**************************************************
        
        public void SendMessageTransactional()
        {
                        
            // Connect to a queue on the local computer.
            MessageQueue myQueue = new
                MessageQueue(".\\myTransactionalQueue");

            // Send a message to the queue.
            if (myQueue.Transactional == true)
            {
                // Create a transaction.
                MessageQueueTransaction myTransaction = new
                    MessageQueueTransaction();

                // Begin the transaction.
                myTransaction.Begin();

                // Send the message.
                myQueue.Send("My Message Data.", myTransaction);

                // Commit the transaction.
                myTransaction.Commit();
            }

            return;
        }

        //**************************************************
        // Receives a message containing an Order.
        //**************************************************
        
        public  void ReceiveMessageTransactional()
        {
            // Connect to a transactional queue on the local computer.
            MessageQueue myQueue = new
                MessageQueue(".\\myTransactionalQueue");

            // Set the formatter.
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(String)});
            
            // Create a transaction.
            MessageQueueTransaction myTransaction = new
                MessageQueueTransaction();

            try
            {
                // Begin the transaction.
                myTransaction.Begin();
                
                // Receive the message.
                Message myMessage =	myQueue.Receive(myTransaction);
                String myOrder = (String)myMessage.Body;

                // Display message information.
                Console.WriteLine(myOrder);

                // Commit the transaction.
                myTransaction.Commit();
            }
            
            catch (MessageQueueException e)
            {
                // Handle nontransactional queues.
                if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.TransactionUsage)
                {
                    Console.WriteLine("Queue is not transactional.");
                }
                
                // Else catch other sources of a MessageQueueException.

                // Roll back the transaction.
                myTransaction.Abort();
            }

            // Catch other exceptions as necessary, such as
            // InvalidOperationException, thrown when the formatter
            // cannot deserialize the message.

            return;
        }
    }
}
Imports System.Messaging

Public Class MyNewQueue


        '
        ' Provides an entry point into the application.
        ' 
        ' This example sends and receives a message from
        ' a transactional queue.
        '

        Public Shared Sub Main()

            ' Create a new instance of the class.
            Dim myNewQueue As New MyNewQueue

            ' Send a message to a queue.
            myNewQueue.SendMessageTransactional()

            ' Receive a message from a queue.
            myNewQueue.ReceiveMessageTransactional()

            Return

        End Sub


        '
        ' Sends a message to a queue.
        '

        Public Sub SendMessageTransactional()

            ' Connect to a queue on the local computer.
            Dim myQueue As New MessageQueue(".\myTransactionalQueue")

            ' Send a message to the queue.
            If myQueue.Transactional = True Then

                ' Create a transaction.
                Dim myTransaction As New MessageQueueTransaction

                ' Begin the transaction.
                myTransaction.Begin()

                ' Send the message.
                myQueue.Send("My Message Data.", myTransaction)

                ' Commit the transaction.
                myTransaction.Commit()

            End If

            Return

        End Sub


        '
        ' Receives a message containing an Order.
        '

        Public Sub ReceiveMessageTransactional()

            ' Connect to a transactional queue on the local computer.
            Dim myQueue As New MessageQueue(".\myTransactionalQueue")

            ' Set the formatter.
            myQueue.Formatter = New XmlMessageFormatter(New Type() _
                {GetType([String])})

            ' Create a transaction.
            Dim myTransaction As New MessageQueueTransaction

            Try

                ' Begin the transaction.
                myTransaction.Begin()

                ' Receive the message. 
                Dim myMessage As Message = _
                    myQueue.Receive(myTransaction)
                Dim myOrder As [String] = CType(myMessage.Body, _
                    [String])

                ' Display message information.
                Console.WriteLine(myOrder)

                ' Commit the transaction.
                myTransaction.Commit()


            Catch e As MessageQueueException

                ' Handle nontransactional queues.
                If e.MessageQueueErrorCode = _
                    MessageQueueErrorCode.TransactionUsage Then

                    Console.WriteLine("Queue is not transactional.")

                End If

                ' Else catch other sources of a MessageQueueException.


                ' Roll back the transaction.
                myTransaction.Abort()


                ' Catch other exceptions as necessary, such as 
                ' InvalidOperationException, thrown when the formatter
                ' cannot deserialize the message.

            End Try

            Return

        End Sub

End Class

Commenti

Usare questo overload per ricevere un messaggio da una coda transazionale usando il contesto di transazione interno definito dal transaction parametro oppure attendere fino a quando non sono presenti messaggi nella coda.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendolo dalla coda. Le chiamate successive a Receive restituiranno i messaggi che seguono nella coda.

Poiché questo metodo viene chiamato in una coda transazionale, il messaggio ricevuto verrà restituito alla coda se la transazione viene interrotta. Il messaggio non viene rimosso definitivamente dalla coda finché non viene eseguito il commit della transazione.

Per leggere il primo messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Il Peek metodo restituisce sempre il primo messaggio nella coda, quindi le chiamate successive al metodo restituiscono lo stesso messaggio a meno che non arrivi un messaggio con priorità più alta nella coda. Non esiste alcun contesto di transazione associato a un messaggio restituito da una chiamata a Peek. Poiché Peek non rimuove alcun messaggio nella coda, non è necessario eseguire il rollback tramite una chiamata a Abort.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Poiché questo overload del Receive metodo specifica un timeout infinito, l'applicazione potrebbe attendere per un periodo illimitato. Se l'elaborazione dell'applicazione deve continuare senza attendere il messaggio, provare a usare il metodo asincrono . BeginReceive

Nella tabella seguente viene illustrato se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Computer locale e nome del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Receive(MessageQueueTransactionType)

Riceve il primo messaggio disponibile nella coda a cui MessageQueue fa riferimento. Questa chiamata è sincrona e blocca il thread corrente di esecuzione finché non è disponibile un messaggio.

public:
 System::Messaging::Message ^ Receive(System::Messaging::MessageQueueTransactionType transactionType);
public System.Messaging.Message Receive (System.Messaging.MessageQueueTransactionType transactionType);
member this.Receive : System.Messaging.MessageQueueTransactionType -> System.Messaging.Message
Public Function Receive (transactionType As MessageQueueTransactionType) As Message

Parametri

transactionType
MessageQueueTransactionType

Uno dei valori di MessageQueueTransactionType che descrive il tipo di contesto di transazione da associare al messaggio.

Restituisce

Oggetto Message che fa riferimento al primo messaggio disponibile nella coda.

Eccezioni

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Il parametro transactionType non è uno dei membri di MessageQueueTransactionType.

Esempio

L'esempio di codice seguente illustra l'uso di Receive(MessageQueueTransactionType).


// Connect to a transactional queue on the local computer.
MessageQueue^ queue = gcnew MessageQueue(".\\exampleTransQueue");

// Create a new message.
Message^ msg = gcnew Message("Example Message Body");

// Send the message.
queue->Send(msg, MessageQueueTransactionType::Single);

// Simulate doing other work so the message has time to arrive.
System::Threading::Thread::Sleep(TimeSpan::FromSeconds(10.0));

// Set the formatter to indicate the message body contains a String.
queue->Formatter = gcnew XmlMessageFormatter(
    gcnew array<Type^>{String::typeid});

// Receive the message from the queue.  Because the Id of the message
// , it might not be the message just sent.
msg = queue->Receive(MessageQueueTransactionType::Single);

queue->Close();

// Connect to a transactional queue on the local computer.
MessageQueue queue = new MessageQueue(".\\exampleTransQueue");

// Create a new message.
Message msg = new Message("Example Message Body");

// Send the message.
queue.Send(msg, MessageQueueTransactionType.Single);

// Simulate doing other work so the message has time to arrive.
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0));

// Set the formatter to indicate the message body contains a String.
queue.Formatter = new XmlMessageFormatter(new Type[]
    {typeof(String)});

// Receive the message from the queue.  Because the Id of the message
// , it might not be the message just sent.
msg = queue.Receive(MessageQueueTransactionType.Single);

Commenti

Usare questo overload per ricevere un messaggio da una coda usando un contesto di transazione definito dal transactionType parametro oppure attendere fino a quando non sono presenti messaggi nella coda.

Specificare Automatic per il transactionType parametro se è già presente un contesto di transazione esterna collegato al thread che si vuole usare per ricevere il messaggio. Specificare Single se si desidera ricevere il messaggio come singola transazione interna. È possibile specificare None se si desidera ricevere un messaggio da una coda transazionale all'esterno di un contesto di transazione.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendola dalla coda. Le chiamate successive a Receive restituiranno i messaggi che seguono nella coda.

Se questo metodo viene chiamato per ricevere un messaggio da una coda transazionale, il messaggio ricevuto verrà restituito alla coda se la transazione viene interrotta. Il messaggio non viene rimosso definitivamente dalla coda fino al commit della transazione.

Per leggere il primo messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Il Peek metodo restituisce sempre il primo messaggio nella coda, quindi le chiamate successive al metodo restituiscono lo stesso messaggio a meno che non arrivi un messaggio di priorità superiore nella coda. Non esiste alcun contesto di transazione associato a un messaggio restituito da una chiamata a Peek. Poiché Peek non rimuove alcun messaggio nella coda, non sarebbe necessario eseguire il rollback di una chiamata a Abort.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Poiché questo overload del Receive metodo specifica un timeout infinito, l'applicazione potrebbe attendere in modo indefinito. Se l'elaborazione dell'applicazione deve continuare senza attendere il messaggio, prendere in considerazione l'uso del metodo asincrono, BeginReceive.

La tabella seguente mostra se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Nome del computer locale e del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Receive(TimeSpan)

Riceve il primo messaggio disponibile nella coda cui l'oggetto MessageQueue fa riferimento e attende che un messaggio sia disponibile nella coda o che il timeout scada.

public:
 System::Messaging::Message ^ Receive(TimeSpan timeout);
public System.Messaging.Message Receive (TimeSpan timeout);
member this.Receive : TimeSpan -> System.Messaging.Message
Public Function Receive (timeout As TimeSpan) As Message

Parametri

timeout
TimeSpan

Oggetto TimeSpan che indica l'intervallo di attesa prima che un nuovo messaggio venga reso disponibile per il controllo.

Restituisce

Oggetto Message che fa riferimento al primo messaggio disponibile nella coda.

Eccezioni

Il valore specificato per il parametro timeout non è valido, probabilmente perché timeout è minore di Zero o maggiore di InfiniteTimeout.

Un messaggio non è arrivato nella coda prima della scadenza del timeout.

-oppure-

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Esempio

L'esempio di codice seguente riceve un messaggio da una coda e restituisce informazioni su tale messaggio sullo schermo. L'esempio sospende l'esecuzione per un massimo di cinque secondi durante l'attesa dell'arrivo di un messaggio nella coda.

#using <system.dll>
#using <system.messaging.dll>

using namespace System;
using namespace System::Messaging;

// This class represents an object the following example 
// receives from a queue.
ref class Order
{
public:
   int orderId;
   DateTime orderTime;
};


/// <summary>
/// Provides a container class for the example.
/// </summary>
ref class MyNewQueue
{
public:

   //*************************************************
   // Receives a message containing an Order.
   //*************************************************
   void ReceiveMessage()
   {
      // Connect to the a queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );

      // Set the formatter to indicate body contains an Order.
      array<Type^>^p = gcnew array<Type^>(1);
      p[ 0 ] = Order::typeid;
      myQueue->Formatter = gcnew XmlMessageFormatter( p );
      try
      {
         // Receive and format the message. 
         // Wait 5 seconds for a message to arrive.
         Message^ myMessage = myQueue->Receive( TimeSpan(0,0,5) );
         Order^ myOrder = static_cast<Order^>(myMessage->Body);

         // Display message information.
         Console::WriteLine( "Order ID: {0}", myOrder->orderId );
         Console::WriteLine( "Sent: {0}", myOrder->orderTime );
      }
      catch ( MessageQueueException^ e ) 
      {
         // Handle no message arriving in the queue.
         if ( e->MessageQueueErrorCode == MessageQueueErrorCode::IOTimeout )
         {
            Console::WriteLine( "No message arrived in queue." );
         }

         // Handle other sources of a MessageQueueException.
      }
      // Handle invalid serialization format.
      catch ( InvalidOperationException^ e ) 
      {
         Console::WriteLine( e->Message );
      }

      // Catch other exceptions as necessary.
      return;
   }
};

//*************************************************
// Provides an entry point into the application.
//         
// This example receives a message from a queue.
//*************************************************
int main()
{
   // Create a new instance of the class.
   MyNewQueue^ myNewQueue = gcnew MyNewQueue;

   // Receive a message from a queue.
   myNewQueue->ReceiveMessage();
   return 0;
}
using System;
using System.Messaging;

namespace MyProject
{
    // This class represents an object the following example
    // receives from a queue.

    public class Order
    {
        public int orderId;
        public DateTime orderTime;
    };	

    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {

        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example receives a message from a queue.
        //**************************************************

        public static void Main()
        {
            // Create a new instance of the class.
            MyNewQueue myNewQueue = new MyNewQueue();

            // Receive a message from a queue.
            myNewQueue.ReceiveMessage();

            return;
        }

        //**************************************************
        // Receives a message containing an Order.
        //**************************************************

        public void ReceiveMessage()
        {
            // Connect to the a queue on the local computer.
            MessageQueue myQueue = new MessageQueue(".\\myQueue");

            // Set the formatter to indicate body contains an Order.
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(MyProject.Order)});
            
            try
            {
                // Receive and format the message.
                // Wait 5 seconds for a message to arrive.
                Message myMessage =	myQueue.Receive(new
                    TimeSpan(0,0,5));
                Order myOrder = (Order)myMessage.Body;

                // Display message information.
                Console.WriteLine("Order ID: " +
                    myOrder.orderId.ToString());
                Console.WriteLine("Sent: " +
                    myOrder.orderTime.ToString());
            }

            catch (MessageQueueException e)
            {
                // Handle no message arriving in the queue.
                if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.IOTimeout)
                {
                    Console.WriteLine("No message arrived in queue.");
                }			

                // Handle other sources of a MessageQueueException.
            }
            
            // Handle invalid serialization format.
            catch (InvalidOperationException e)
            {
                Console.WriteLine(e.Message);
            }
            
            // Catch other exceptions as necessary.

            return;
        }
    }
}
Imports System.Messaging

' This class represents an object the following example 
' receives from a queue.
Public Class Order
        Public orderId As Integer
        Public orderTime As DateTime
End Class


   
Public Class MyNewQueue


        '
        ' Provides an entry point into the application.
        '		 
        ' This example receives a message from a queue.
        '

        Public Shared Sub Main()

            ' Create a new instance of the class.
            Dim myNewQueue As New MyNewQueue()

            ' Receive a message from a queue.
            myNewQueue.ReceiveMessage()

            Return

        End Sub


        '
        ' Receives a message containing an Order.
        '

        Public Sub ReceiveMessage()

            ' Connect to the a queue on the local computer.
            Dim myQueue As New MessageQueue(".\myQueue")

            ' Set the formatter to indicate body contains an Order.
            myQueue.Formatter = New XmlMessageFormatter(New Type() _
                {GetType(Order)})

            Try

                ' Receive and format the message. 
                ' Wait 5 seconds for a message to arrive.
                Dim myMessage As Message = myQueue.Receive(New _
                    TimeSpan(0, 0, 5))
                Dim myOrder As Order = CType(myMessage.Body, Order)

                ' Display message information.
                Console.WriteLine(("Order ID: " + _
                    myOrder.orderId.ToString()))
                Console.WriteLine(("Sent: " + _
                    myOrder.orderTime.ToString()))

            Catch e As MessageQueueException
                ' Handle no message arriving in the queue.
                If e.MessageQueueErrorCode = _
                    MessageQueueErrorCode.IOTimeout Then

                    Console.WriteLine("No message arrived in queue.")

                End If

                ' Handle other sources of a MessageQueueException.

            Catch e As InvalidOperationException
                ' Handle invalid serialization format.
                Console.WriteLine(e.Message)

                ' Catch other exceptions as necessary.

            End Try

            Return

        End Sub

End Class

Commenti

Utilizzare questo overload per ricevere e restituire un messaggio in un periodo di tempo specificato se nella coda non sono disponibili messaggi.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendolo dalla coda. Le chiamate successive a Receive restituiranno i messaggi che seguono nella coda o nuovi messaggi con priorità superiore.

Per leggere il primo messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Il Peek metodo restituisce sempre il primo messaggio nella coda, quindi le chiamate successive al metodo restituiscono lo stesso messaggio a meno che non arrivi un messaggio di priorità superiore nella coda.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Il thread verrà bloccato per il periodo di tempo specificato o indefinito se è stato specificato il valore InfiniteTimeout per il timeout parametro. Se l'elaborazione dell'applicazione deve continuare senza attendere un messaggio, prendere in considerazione l'uso del metodo asincrono, BeginReceive.

La tabella seguente mostra se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Nome del computer locale e del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Receive(TimeSpan, Cursor)

Riceve il messaggio corrente nella coda, utilizzando il cursore specificato. Se non è disponibile alcun messaggio, il metodo aspetta finché non risulta disponibile un messaggio o finché non scade il periodo di timeout.

public:
 System::Messaging::Message ^ Receive(TimeSpan timeout, System::Messaging::Cursor ^ cursor);
public System.Messaging.Message Receive (TimeSpan timeout, System.Messaging.Cursor cursor);
member this.Receive : TimeSpan * System.Messaging.Cursor -> System.Messaging.Message
Public Function Receive (timeout As TimeSpan, cursor As Cursor) As Message

Parametri

timeout
TimeSpan

Oggetto TimeSpan che indica l'intervallo di attesa prima che un nuovo messaggio venga reso disponibile per il controllo.

cursor
Cursor

Oggetto Cursor che occupa una posizione specifica nella coda messaggi.

Restituisce

Oggetto Message che fa riferimento al primo messaggio disponibile nella coda.

Eccezioni

Il valore specificato per il parametro timeout non è valido, probabilmente perché timeout è minore di Zero o maggiore di InfiniteTimeout.

Un messaggio non è arrivato nella coda prima della scadenza del timeout.

-oppure-

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Utilizzare questo overload per ricevere e restituire un messaggio in un periodo di tempo specificato se nella coda non sono disponibili messaggi.

Si applica a

Receive(TimeSpan, MessageQueueTransaction)

Riceve il primo messaggio disponibile nella coda transazionale cui l'oggetto MessageQueue fa riferimento e attende che un messaggio sia disponibile nella coda o che il timeout scada.

public:
 System::Messaging::Message ^ Receive(TimeSpan timeout, System::Messaging::MessageQueueTransaction ^ transaction);
public System.Messaging.Message Receive (TimeSpan timeout, System.Messaging.MessageQueueTransaction transaction);
member this.Receive : TimeSpan * System.Messaging.MessageQueueTransaction -> System.Messaging.Message
Public Function Receive (timeout As TimeSpan, transaction As MessageQueueTransaction) As Message

Parametri

timeout
TimeSpan

Oggetto TimeSpan che indica l'intervallo di attesa prima che un nuovo messaggio venga reso disponibile per il controllo.

Restituisce

Oggetto Message che fa riferimento al primo messaggio disponibile nella coda.

Eccezioni

Il valore specificato per il parametro timeout non è valido, probabilmente perché timeout è minore di Zero o maggiore di InfiniteTimeout.

Un messaggio non è arrivato nella coda prima della scadenza del timeout.

-oppure-

La coda non è transazionale.

-oppure-

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Esempio

Nell'esempio di codice seguente viene illustrato l'uso di questo metodo.

#using <system.dll>
#using <system.messaging.dll>

using namespace System;
using namespace System::Messaging;

/// <summary>
/// Provides a container class for the example.
/// </summary>
ref class MyNewQueue
{
public:

   //*************************************************
   // Sends a message to a transactional queue.
   //*************************************************
   void SendMessageTransactional()
   {
      // Connect to a queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myTransactionalQueue" );

      // Send a message to the queue.
      if ( myQueue->Transactional == true )
      {
         // Create a transaction.
         MessageQueueTransaction^ myTransaction = gcnew MessageQueueTransaction;

         // Begin the transaction.
         myTransaction->Begin();

         // Send the message.
         myQueue->Send( "My Message Data.", myTransaction );

         // Commit the transaction.
         myTransaction->Commit();
      }

      return;
   }

   //*************************************************
   // Receives a message from the transactional queue.
   //*************************************************
   void ReceiveMessageTransactional()
   {
      // Connect to a transactional queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myTransactionalQueue" );

      // Set the formatter.
      array<Type^>^p = gcnew array<Type^>(1);
      p[ 0 ] = String::typeid;
      myQueue->Formatter = gcnew XmlMessageFormatter( p );

      // Create a transaction.
      MessageQueueTransaction^ myTransaction = gcnew MessageQueueTransaction;
      try
      {
         // Begin the transaction.
         myTransaction->Begin();

         // Receive the message. 
         // Wait five seconds for a message to arrive. 
         Message^ myMessage = myQueue->Receive( TimeSpan(0,0,5), myTransaction );
         String^ myOrder = static_cast<String^>(myMessage->Body);

         // Display message information.
         Console::WriteLine( myOrder );

         // Commit the transaction.
         myTransaction->Commit();
      }
      catch ( MessageQueueException^ e ) 
      {
         // Handle nontransactional queues.
         if ( e->MessageQueueErrorCode == MessageQueueErrorCode::TransactionUsage )
         {
            Console::WriteLine( "Queue is not transactional." );
         }
         // Handle no message arriving in the queue.
         else

         // Handle no message arriving in the queue.
         if ( e->MessageQueueErrorCode == MessageQueueErrorCode::IOTimeout )
         {
            Console::WriteLine( "No message in queue." );
         }

         // Else catch other sources of MessageQueueException.
         // Roll back the transaction.
         myTransaction->Abort();
      }

      // Catch other exceptions as necessary, such as 
      // InvalidOperationException, thrown when the formatter 
      // cannot deserialize the message.
      return;
   }
};

//*************************************************
// Provides an entry point into the application.
// 
// This example sends and receives a message from
// a transactional queue.
//*************************************************
int main()
{
   // Create a new instance of the class.
   MyNewQueue^ myNewQueue = gcnew MyNewQueue;

   // Send a message to a queue.
   myNewQueue->SendMessageTransactional();

   // Receive a message from a queue.
   myNewQueue->ReceiveMessageTransactional();
   return 0;
}
using System;
using System.Messaging;

namespace MyProject
{

    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {

        //**************************************************
        // Provides an entry point into the application.
        //
        // This example sends and receives a message from
        // a transactional queue.
        //**************************************************

        public static void Main()
        {
            // Create a new instance of the class.
            MyNewQueue myNewQueue = new MyNewQueue();

            // Send a message to a queue.
            myNewQueue.SendMessageTransactional();

            // Receive a message from a queue.
            myNewQueue.ReceiveMessageTransactional();

            return;
        }

        //**************************************************
        // Sends a message to a transactional queue.
        //**************************************************
        
        public void SendMessageTransactional()
        {
                        
            // Connect to a queue on the local computer.
            MessageQueue myQueue = new
                MessageQueue(".\\myTransactionalQueue");

            // Send a message to the queue.
            if (myQueue.Transactional == true)
            {
                // Create a transaction.
                MessageQueueTransaction myTransaction = new
                    MessageQueueTransaction();

                // Begin the transaction.
                myTransaction.Begin();

                // Send the message.
                myQueue.Send("My Message Data.", myTransaction);

                // Commit the transaction.
                myTransaction.Commit();
            }

            return;
        }

        //**************************************************
        // Receives a message from the transactional queue.
        //**************************************************
        
        public  void ReceiveMessageTransactional()
        {
            // Connect to a transactional queue on the local computer.
            MessageQueue myQueue = new
                MessageQueue(".\\myTransactionalQueue");

            // Set the formatter.
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(String)});
            
            // Create a transaction.
            MessageQueueTransaction myTransaction = new
                MessageQueueTransaction();

            try
            {
                // Begin the transaction.
                myTransaction.Begin();
                
                // Receive the message.
                // Wait five seconds for a message to arrive.
                Message myMessage =	myQueue.Receive(new
                    TimeSpan(0,0,5), myTransaction);
                
                String myOrder = (String)myMessage.Body;

                // Display message information.
                Console.WriteLine(myOrder);

                // Commit the transaction.
                myTransaction.Commit();
            }
            
            catch (MessageQueueException e)
            {
                // Handle nontransactional queues.
                if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.TransactionUsage)
                {
                    Console.WriteLine("Queue is not transactional.");
                }

                    // Handle no message arriving in the queue.
                else if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.IOTimeout)
                {
                    Console.WriteLine("No message in queue.");
                }
                
                // Else catch other sources of MessageQueueException.

                // Roll back the transaction.
                myTransaction.Abort();
            }

            // Catch other exceptions as necessary, such as
            // InvalidOperationException, thrown when the formatter
            // cannot deserialize the message.

            return;
        }
    }
}
Imports System.Messaging

Namespace MyProj


   
    Public Class MyNewQueue


        '**************************************************
        ' Provides an entry point into the application.
        ' 
        ' This example sends and receives a message from
        ' a transactional queue.
        '**************************************************

        Public Shared Sub Main()

            ' Create a new instance of the class.
            Dim myNewQueue As New MyNewQueue

            ' Send a message to a queue.
            myNewQueue.SendMessageTransactional()

            ' Receive a message from a queue.
            myNewQueue.ReceiveMessageTransactional()

            Return

        End Sub


        '**************************************************
        ' Sends a message to a transactional queue.
        '**************************************************

        Public Sub SendMessageTransactional()

            ' Connect to a queue on the local computer.
            Dim myQueue As New MessageQueue(".\myTransactionalQueue")

            ' Send a message to the queue.
            If myQueue.Transactional = True Then

                ' Create a transaction.
                Dim myTransaction As New MessageQueueTransaction

                ' Begin the transaction.
                myTransaction.Begin()

                ' Send the message.
                myQueue.Send("My Message Data.", myTransaction)

                ' Commit the transaction.
                myTransaction.Commit()

            End If

            Return

        End Sub


        '**************************************************
        ' Receives a message from the transactional queue.
        '**************************************************

        Public Sub ReceiveMessageTransactional()

            ' Connect to a transactional queue on the local computer.
            Dim myQueue As New MessageQueue(".\myTransactionalQueue")

            ' Set the formatter.
            myQueue.Formatter = New XmlMessageFormatter(New Type() _
                {GetType([String])})

            ' Create a transaction.
            Dim myTransaction As New MessageQueueTransaction

            Try

                ' Begin the transaction.
                myTransaction.Begin()

                ' Receive the message. 
                ' Wait five seconds for a message to arrive. 
                Dim myMessage As Message = myQueue.Receive(New _
                    TimeSpan(0, 0, 5), myTransaction)
                Dim myOrder As [String] = CType(myMessage.Body, _
                    [String])

                ' Display message information.
                Console.WriteLine(myOrder)

                ' Commit the transaction.
                myTransaction.Commit()


            Catch e As MessageQueueException

                ' Handle nontransactional queues.
                If e.MessageQueueErrorCode = _
                    MessageQueueErrorCode.TransactionUsage Then

                    Console.WriteLine("Queue is not transactional.")

                Else
                    ' Handle no message arriving in the queue.
                    If e.MessageQueueErrorCode = _
                        MessageQueueErrorCode.IOTimeout Then

                        Console.WriteLine("No message in queue.")

                    End If
                End If

                ' Else catch other sources of a MessageQueueException.

                ' Roll back the transaction.
                myTransaction.Abort()


                ' Catch other exceptions as necessary, such as InvalidOperationException,
                ' thrown when the formatter cannot deserialize the message.

            End Try

            Return

        End Sub

    End Class
End Namespace 'MyProj

Commenti

Usare questo overload per ricevere un messaggio da una coda transazionale usando il transaction contesto di transazione interno definito dal parametro e restituire entro un periodo di tempo specificato se non sono presenti messaggi nella coda.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendola dalla coda. Le chiamate successive a Receive restituiranno i messaggi che seguono nella coda.

Poiché questo metodo viene chiamato in una coda transazionale, il messaggio ricevuto verrà restituito alla coda se la transazione viene interrotta. Il messaggio non viene rimosso definitivamente dalla coda fino al commit della transazione.

Per leggere il primo messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Il Peek metodo restituisce sempre il primo messaggio nella coda, quindi le chiamate successive al metodo restituiscono lo stesso messaggio a meno che non arrivi un messaggio di priorità superiore nella coda. Non esiste alcun contesto di transazione associato a un messaggio restituito da una chiamata a Peek. Poiché Peek non rimuove alcun messaggio nella coda, non sarebbe necessario eseguire il rollback di una chiamata a Abort.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Il thread verrà bloccato per il periodo di tempo specificato o indefinito se è stato specificato il valore InfiniteTimeout per il timeout parametro. Se l'elaborazione dell'applicazione deve continuare senza attendere un messaggio, prendere in considerazione l'uso del metodo asincrono, BeginReceive.

La tabella seguente mostra se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Nome del computer locale e del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Receive(TimeSpan, MessageQueueTransactionType)

Riceve il primo messaggio disponibile nella coda a cui MessageQueue fa riferimento. Questa chiamata è sincrona e attende che un messaggio venga reso disponibile nella coda o il timeout scada.

public:
 System::Messaging::Message ^ Receive(TimeSpan timeout, System::Messaging::MessageQueueTransactionType transactionType);
public System.Messaging.Message Receive (TimeSpan timeout, System.Messaging.MessageQueueTransactionType transactionType);
member this.Receive : TimeSpan * System.Messaging.MessageQueueTransactionType -> System.Messaging.Message
Public Function Receive (timeout As TimeSpan, transactionType As MessageQueueTransactionType) As Message

Parametri

timeout
TimeSpan

Oggetto TimeSpan che indica l'intervallo di attesa prima che un nuovo messaggio venga reso disponibile per il controllo.

transactionType
MessageQueueTransactionType

Uno dei valori di MessageQueueTransactionType che descrive il tipo di contesto di transazione da associare al messaggio.

Restituisce

Oggetto Message che fa riferimento al primo messaggio disponibile nella coda.

Eccezioni

Il valore specificato per il parametro timeout non è valido, probabilmente perché timeout è minore di Zero o maggiore di InfiniteTimeout.

Il parametro transactionType non è uno dei membri di MessageQueueTransactionType.

Un messaggio non è arrivato nella coda prima della scadenza del timeout.

-oppure-

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Esempio

Nell'esempio di codice seguente viene illustrato l'uso di questo metodo.


// Connect to a transactional queue on the local computer.
MessageQueue^ queue = gcnew MessageQueue(".\\exampleTransQueue");

// Create a new message.
Message^ msg = gcnew Message("Example Message Body");

// Send the message.
queue->Send(msg, MessageQueueTransactionType::Single);

// Set the formatter to indicate the message body contains a String.
queue->Formatter = gcnew XmlMessageFormatter(
    gcnew array<Type^>{String::typeid});

// Receive the message from the queue. Because the Id of the message
// is not specified, it might not be the message just sent.
msg = queue->Receive(TimeSpan::FromSeconds(10.0),
    MessageQueueTransactionType::Single);

queue->Close();

// Connect to a transactional queue on the local computer.
MessageQueue queue = new MessageQueue(".\\exampleTransQueue");

// Create a new message.
Message msg = new Message("Example Message Body");

// Send the message.
queue.Send(msg, MessageQueueTransactionType.Single);

// Set the formatter to indicate the message body contains a String.
queue.Formatter = new XmlMessageFormatter(new Type[]
    {typeof(String)});

// Receive the message from the queue. Because the Id of the message
// is not specified, it might not be the message just sent.
msg = queue.Receive(TimeSpan.FromSeconds(10.0),
    MessageQueueTransactionType.Single);

Commenti

Utilizzare questo overload per ricevere un messaggio da una coda usando un contesto di transazione definito dal transactionType parametro e restituire in un periodo di tempo specificato se non sono presenti messaggi nella coda.

Specificare Automatic per il transactionType parametro se è già presente un contesto di transazione esterna collegato al thread che si vuole usare per ricevere il messaggio. Specificare Single se si desidera ricevere il messaggio come singola transazione interna. È possibile specificare None se si desidera ricevere un messaggio da una coda transazionale all'esterno di un contesto di transazione.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendolo dalla coda. Le chiamate successive a Receive restituiranno i messaggi che seguono nella coda.

Se questo metodo viene chiamato per ricevere un messaggio da una coda transazionale, il messaggio ricevuto verrà restituito alla coda se la transazione viene interrotta. Il messaggio non viene rimosso definitivamente dalla coda finché non viene eseguito il commit della transazione.

Per leggere il primo messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Il Peek metodo restituisce sempre il primo messaggio nella coda, quindi le chiamate successive al metodo restituiscono lo stesso messaggio a meno che non arrivi un messaggio con priorità più alta nella coda. Non esiste alcun contesto di transazione associato a un messaggio restituito da una chiamata a Peek. Poiché Peek non rimuove alcun messaggio nella coda, non è necessario eseguire il rollback tramite una chiamata a Abort.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Il thread verrà bloccato per il periodo di tempo specificato o per un periodo illimitato se è stato specificato il valore InfiniteTimeout per il timeout parametro . Se l'elaborazione dell'applicazione deve continuare senza attendere un messaggio, provare a usare il metodo asincrono . BeginReceive

Nella tabella seguente viene illustrato se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Computer locale e nome del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Receive(TimeSpan, Cursor, MessageQueueTransaction)

Riceve il messaggio corrente nella coda, utilizzando il cursore specificato. Se non è disponibile alcun messaggio, il metodo aspetta finché non risulta disponibile un messaggio o finché non scade il periodo di timeout.

public:
 System::Messaging::Message ^ Receive(TimeSpan timeout, System::Messaging::Cursor ^ cursor, System::Messaging::MessageQueueTransaction ^ transaction);
public System.Messaging.Message Receive (TimeSpan timeout, System.Messaging.Cursor cursor, System.Messaging.MessageQueueTransaction transaction);
member this.Receive : TimeSpan * System.Messaging.Cursor * System.Messaging.MessageQueueTransaction -> System.Messaging.Message
Public Function Receive (timeout As TimeSpan, cursor As Cursor, transaction As MessageQueueTransaction) As Message

Parametri

timeout
TimeSpan

Oggetto TimeSpan che indica l'intervallo di attesa prima che un nuovo messaggio venga reso disponibile per il controllo.

cursor
Cursor

Oggetto Cursor che occupa una posizione specifica nella coda messaggi.

Restituisce

Oggetto Message che fa riferimento a un messaggio della coda.

Eccezioni

Il valore del parametro cursor è null.

-oppure-

Il valore del parametro transaction è null.

Il valore specificato per il parametro timeout non è valido. Probabilmente timeout è minore di Zero o maggiore di InfiniteTimeout.

Un messaggio non è arrivato nella coda prima della scadenza del timeout.

-oppure-

La coda non è transazionale.

-oppure-

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Commenti

Utilizzare questo overload per ricevere un messaggio da una coda transazionale usando il contesto di transazione interno definito dal transaction parametro e restituire entro un periodo di tempo specificato se non sono presenti messaggi nella coda.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendolo dalla coda. Chiamate successive per Receive restituire i messaggi che seguono nella coda.

Poiché questo metodo viene chiamato in una coda transazionale, il messaggio ricevuto viene restituito alla coda se la transazione viene interrotta. Il messaggio non viene rimosso definitivamente dalla coda finché non viene eseguito il commit della transazione.

Per leggere un messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Non esiste alcun contesto di transazione associato a un messaggio restituito da una chiamata a Peek. Poiché Peek non rimuove alcun messaggio nella coda, non è necessario eseguire il rollback tramite una chiamata a Abort.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Il thread viene bloccato per il periodo di tempo specificato o per un periodo illimitato se è stato specificato il valore InfiniteTimeout per il timeout parametro . Se l'elaborazione dell'applicazione deve continuare senza attendere un messaggio, provare a usare il metodo asincrono . BeginReceive

Nella tabella seguente viene illustrato se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Computer locale e nome del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Receive(TimeSpan, Cursor, MessageQueueTransactionType)

Riceve il messaggio corrente nella coda, utilizzando il cursore specificato. Se non è disponibile alcun messaggio, il metodo aspetta finché non risulta disponibile un messaggio o finché non scade il periodo di timeout.

public:
 System::Messaging::Message ^ Receive(TimeSpan timeout, System::Messaging::Cursor ^ cursor, System::Messaging::MessageQueueTransactionType transactionType);
public System.Messaging.Message Receive (TimeSpan timeout, System.Messaging.Cursor cursor, System.Messaging.MessageQueueTransactionType transactionType);
member this.Receive : TimeSpan * System.Messaging.Cursor * System.Messaging.MessageQueueTransactionType -> System.Messaging.Message
Public Function Receive (timeout As TimeSpan, cursor As Cursor, transactionType As MessageQueueTransactionType) As Message

Parametri

timeout
TimeSpan

Oggetto TimeSpan che indica l'intervallo di attesa prima che un nuovo messaggio venga reso disponibile per il controllo.

cursor
Cursor

Oggetto Cursor che occupa una posizione specifica nella coda messaggi.

transactionType
MessageQueueTransactionType

Uno dei valori di MessageQueueTransactionType che descrive il tipo di contesto di transazione da associare al messaggio.

Restituisce

Oggetto Message che fa riferimento a un messaggio della coda.

Eccezioni

Il valore del parametro cursor è null.

Il valore specificato per il parametro timeout non è valido. Probabilmente timeout è minore di Zero o maggiore di InfiniteTimeout.

Il parametro transactionType non è uno dei membri di MessageQueueTransactionType.

Un messaggio non è arrivato nella coda prima della scadenza del timeout.

-oppure-

Si è verificato un errore durante l'accesso a un metodo di Accodamento messaggi.

Commenti

Utilizzare questo overload per ricevere un messaggio da una coda usando un contesto di transazione definito dal transactionType parametro e restituire in un periodo di tempo specificato se non sono presenti messaggi nella coda.

Specificare Automatic per il transactionType parametro se è già presente un contesto di transazione esterna collegato al thread che si vuole usare per ricevere il messaggio. Specificare Single se si desidera ricevere il messaggio come singola transazione interna. È possibile specificare None se si desidera ricevere un messaggio da una coda transazionale all'esterno di un contesto di transazione.

Il Receive metodo consente la lettura sincrona di un messaggio, rimuovendolo dalla coda. Chiamate successive per Receive restituire i messaggi che seguono nella coda.

Se questo metodo viene chiamato per ricevere un messaggio da una coda transazionale, il messaggio ricevuto viene restituito alla coda se la transazione viene interrotta. Il messaggio non viene rimosso definitivamente dalla coda finché non viene eseguito il commit della transazione.

Per leggere un messaggio in una coda senza rimuoverlo dalla coda, usare il Peek metodo . Non esiste alcun contesto di transazione associato a un messaggio restituito da una chiamata a Peek. Poiché Peek non rimuove alcun messaggio nella coda, non è necessario eseguire il rollback tramite una chiamata a Abort.

Usare una chiamata a Receive quando è accettabile che il thread corrente venga bloccato mentre attende l'arrivo di un messaggio nella coda. Il thread viene bloccato per il periodo di tempo specificato o per un periodo illimitato se è stato specificato il valore InfiniteTimeout per il timeout parametro . Se l'elaborazione dell'applicazione deve continuare senza attendere un messaggio, provare a usare il metodo asincrono . BeginReceive

Nella tabella seguente viene illustrato se questo metodo è disponibile in varie modalità gruppo di lavoro.

Modalità gruppo di lavoro Disponibile
Computer locale
Nome del computer locale e del formato diretto
Computer remoto No
Nome del formato diretto e del computer remoto

Vedi anche

Si applica a

Thread safety

Il metodo non è thread safe.