MessageQueue.Receive Метод

Определение

Получает первое сообщение в очереди, удаляя его из очереди.Receives the first message in the queue, removing it from the queue.

Перегрузки

Receive()

Получает первое доступное в очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the queue referenced by the MessageQueue. Этот вызов является синхронным и он блокирует текущий поток выполнения, пока сообщение не станет доступным.This call is synchronous, and blocks the current thread of execution until a message is available.

Receive(MessageQueueTransaction)

Получает первое доступное в транзакционной очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the transactional queue referenced by the MessageQueue. Этот вызов является синхронным и он блокирует текущий поток выполнения, пока сообщение не станет доступным.This call is synchronous, and blocks the current thread of execution until a message is available.

Receive(MessageQueueTransactionType)

Получает первое доступное в очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the queue referenced by the MessageQueue. Этот вызов является синхронным и он блокирует текущий поток выполнения, пока сообщение не станет доступным.This call is synchronous, and blocks the current thread of execution until a message is available.

Receive(TimeSpan)

Получает первое сообщение, доступное в очереди, на которую ссылается объект MessageQueue, и ожидает пока в очереди не появится сообщение или пока не истечет тайм-аут.Receives the first message available in the queue referenced by the MessageQueue and waits until either a message is available in the queue, or the time-out expires.

Receive(TimeSpan, Cursor)

Получает текущее сообщение в очереди, используя заданный курсор.Receives the current message in the queue, using a specified cursor. Если доступных сообщений нет, этот метод ожидает, пока не станет доступным сообщение или пока не истечет тайм-аут.If no message is available, this method waits until either a message is available, or the time-out expires.

Receive(TimeSpan, MessageQueueTransaction)

Получает первое сообщение, доступное в транзакционной очереди, на которую ссылается объект MessageQueue, и ожидает, пока в очереди не появится сообщение или пока не истечет тайм-аут.Receives the first message available in the transactional queue referenced by the MessageQueue and waits until either a message is available in the queue, or the time-out expires.

Receive(TimeSpan, MessageQueueTransactionType)

Получает первое доступное в очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the queue referenced by the MessageQueue. Данный вызов является синхронным, и он ожидает, пока в очереди не появится сообщение, или пока не истечет тайм-аут.This call is synchronous, and waits until either a message is available in the queue, or the time-out expires.

Receive(TimeSpan, Cursor, MessageQueueTransaction)

Получает текущее сообщение в очереди, используя заданный курсор.Receives the current message in the queue, using a specified cursor. Если доступных сообщений нет, этот метод ожидает, пока не станет доступным сообщение или пока не истечет тайм-аут.If no message is available, this method waits until either a message is available, or the time-out expires.

Receive(TimeSpan, Cursor, MessageQueueTransactionType)

Получает текущее сообщение в очереди, используя заданный курсор.Receives the current message in the queue, using a specified cursor. Если доступных сообщений нет, этот метод ожидает, пока не станет доступным сообщение или пока не истечет тайм-аут.If no message is available, this method waits until either a message is available, or the time-out expires.

Receive()

Получает первое доступное в очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the queue referenced by the MessageQueue. Этот вызов является синхронным и он блокирует текущий поток выполнения, пока сообщение не станет доступным.This call is synchronous, and blocks the current thread of execution until a message is available.

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

Возвращаемое значение

Объект Message, ссылающийся на первое доступное в очереди сообщение.A Message that references the first message available in the queue.

Исключения

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method.

Примеры

Следующий пример кода получает сообщение из очереди и выводит сведения об этом сообщении на экран.The following code example receives a message from a queue and outputs information about that message to the screen.

#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

Комментарии

Используйте эту перегрузку для получения сообщения из очереди или ожидания сообщений в очереди.Use this overload to receive a message from a queue, or wait until there are messages in the queue.

Метод Receive позволяет синхронно считывать сообщения, тем самым удаляя его из очереди.The Receive method allows for the synchronous reading of a message, thereby removing it from the queue. Последующие вызовы Receive будут возвращать сообщения, следующие за очередью, или новые сообщения с более высоким приоритетом.Subsequent calls to Receive will return the messages that follow in the queue, or new, higher priority messages.

Чтобы прочитать первое сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read the first message in a queue without removing it from the queue, use the Peek method. Метод Peek всегда возвращает первое сообщение в очереди, поэтому последующие вызовы метода возвращают то же сообщение, если в очередь не поступает сообщение с более высоким приоритетом.The Peek method always returns the first message in the queue, so subsequent calls to the method return the same message unless a higher priority message arrives in the queue.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поскольку эта перегрузка метода Receive указывает на бесконечное время ожидания, приложение может ждать бесконечно.Because this overload of the Receive method specifies an infinite time-out, the application might wait indefinitely. Если обработка приложения должна быть продолжена без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for the message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Дополнительно

Receive(MessageQueueTransaction)

Получает первое доступное в транзакционной очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the transactional queue referenced by the MessageQueue. Этот вызов является синхронным и он блокирует текущий поток выполнения, пока сообщение не станет доступным.This call is synchronous, and blocks the current thread of execution until a message is available.

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

Параметры

Возвращаемое значение

Объект Message, ссылающийся на первое доступное в очереди сообщение.A Message that references the first message available in the queue.

Исключения

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method.

- или --or-

Очередь является нетранзакционной.The queue is non-transactional.

Примеры

В следующем примере кода выполняется подключение к транзакционной очереди на локальном компьютере и отправка сообщения в очередь.The following code example connects to a transactional queue on the local computer and sends a message to the queue. Затем он получает сообщение, содержащее заказ.It then receives the message that contains an order. Если обнаруживает нетранзакционную очередь, она вызывает исключение и выполняет откат транзакции.If it encounters a non-transactional queue, it will throw and exception and rollback the transaction.

#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

Комментарии

Используйте эту перегрузку для получения сообщения из транзакционной очереди с помощью контекста внутренней транзакции, определенного параметром transaction, или дождитесь поступления сообщений в очередь.Use this overload to receive a message from a transactional queue using the internal transaction context defined by the transaction parameter, or wait until there are messages in the queue.

Метод Receive позволяет синхронно считывать сообщения, тем самым удаляя его из очереди.The Receive method allows for the synchronous reading of a message, thereby removing it from the queue. Последующие вызовы Receive будут возвращать сообщения, следующие за очередью.Subsequent calls to Receive will return the messages that follow in the queue.

Поскольку этот метод вызывается для транзакционной очереди, полученное сообщение будет возвращено в очередь, если транзакция прервана.Because this method is called on a transactional queue, the message that is received would be returned to the queue if the transaction is aborted. Сообщение не удаляется навсегда из очереди до тех пор, пока транзакция не будет зафиксирована.The message is not permanently removed from the queue until the transaction is committed.

Чтобы прочитать первое сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read the first message in a queue without removing it from the queue, use the Peek method. Метод Peek всегда возвращает первое сообщение в очереди, поэтому последующие вызовы метода возвращают то же сообщение, если в очередь не поступает сообщение с более высоким приоритетом.The Peek method always returns the first message in the queue, so subsequent calls to the method return the same message unless a higher priority message arrives in the queue. Отсутствует контекст транзакции, связанный с сообщением, возвращенным вызовом Peek.There is no transaction context associated with a message returned by a call to Peek. Поскольку Peek не удаляет какие-либо сообщения в очереди, для отката вызовом функции Abortбудет нечего выполняться.Because Peek does not remove any messages in the queue, there would be nothing to roll back by a call to Abort.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поскольку эта перегрузка метода Receive указывает на бесконечное время ожидания, приложение может ждать бесконечно.Because this overload of the Receive method specifies an infinite time-out, the application might wait indefinitely. Если обработка приложения должна быть продолжена без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for the message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Дополнительно

Receive(MessageQueueTransactionType)

Получает первое доступное в очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the queue referenced by the MessageQueue. Этот вызов является синхронным и он блокирует текущий поток выполнения, пока сообщение не станет доступным.This call is synchronous, and blocks the current thread of execution until a message is available.

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

Параметры

transactionType
MessageQueueTransactionType

Одно из значений MessageQueueTransactionType, описывающее тип контекста транзакции, связываемого с сообщением.One of the MessageQueueTransactionType values, describing the type of transaction context to associate with the message.

Возвращаемое значение

Объект Message, ссылающийся на первое доступное в очереди сообщение.A Message that references the first message available in the queue.

Исключения

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method.

Параметр transactionType не является одним из членов MessageQueueTransactionType.The transactionType parameter is not one of the MessageQueueTransactionType members.

Примеры

В следующем коде показано использование функции Receive(MessageQueueTransactionType).The following code example demonstrates the use of 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); 

Комментарии

Используйте эту перегрузку для получения сообщения из очереди с помощью контекста транзакции, определенного параметром transactionType, или дождитесь поступления сообщений в очередь.Use this overload to receive a message from a queue using a transaction context defined by the transactionType parameter, or wait until there are messages in the queue.

Укажите Automatic для параметра transactionType, если к потоку, который требуется использовать для получения сообщения, уже присоединен контекст внешней транзакции.Specify Automatic for the transactionType parameter if there is already an external transaction context attached to the thread that you want to use to receive the message. Укажите Single, если вы хотите получить сообщение как одну внутреннюю транзакцию.Specify Single if you want to receive the message as a single internal transaction. Можно указать None, если требуется получить сообщение из транзакционной очереди за пределами контекста транзакции.You can specify None if you want to receive a message from a transactional queue outside of a transaction context.

Метод Receive позволяет синхронно считывать сообщения, тем самым удаляя его из очереди.The Receive method allows for the synchronous reading of a message, thereby removing it from the queue. Последующие вызовы Receive будут возвращать сообщения, следующие за очередью.Subsequent calls to Receive will return the messages that follow in the queue.

Если этот метод вызывается для получения сообщения из транзакционной очереди, полученное сообщение будет возвращено в очередь, если транзакция прервана.If this method is called to receive a message from a transactional queue, the message that is received would be returned to the queue if the transaction is aborted. Сообщение не удаляется навсегда из очереди до тех пор, пока транзакция не будет зафиксирована.The message is not permanently removed from the queue until the transaction is committed.

Чтобы прочитать первое сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read the first message in a queue without removing it from the queue, use the Peek method. Метод Peek всегда возвращает первое сообщение в очереди, поэтому последующие вызовы метода возвращают то же сообщение, если в очередь не поступает сообщение с более высоким приоритетом.The Peek method always returns the first message in the queue, so subsequent calls to the method return the same message unless a higher priority message arrives in the queue. Отсутствует контекст транзакции, связанный с сообщением, возвращенным вызовом Peek.There is no transaction context associated with a message returned by a call to Peek. Поскольку Peek не удаляет какие-либо сообщения в очереди, для отката вызовом функции Abortбудет нечего выполняться.Because Peek does not remove any messages in the queue, there would be nothing to roll back by a call to Abort.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поскольку эта перегрузка метода Receive указывает на бесконечное время ожидания, приложение может ждать бесконечно.Because this overload of the Receive method specifies an infinite time-out, the application might wait indefinitely. Если обработка приложения должна быть продолжена без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for the message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Дополнительно

Receive(TimeSpan)

Получает первое сообщение, доступное в очереди, на которую ссылается объект MessageQueue, и ожидает пока в очереди не появится сообщение или пока не истечет тайм-аут.Receives the first message available in the queue referenced by the MessageQueue and waits until either a message is available in the queue, or the time-out expires.

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

Параметры

timeout
TimeSpan

Структура TimeSpan, показывающая время ожидания нового сообщения для проверки.A TimeSpan that indicates the time to wait until a new message is available for inspection.

Возвращаемое значение

Объект Message, ссылающийся на первое доступное в очереди сообщение.A Message that references the first message available in the queue.

Исключения

Для параметра timeout задано недопустимое значение; возможно, значение параметра timeout меньше Zero или больше InfiniteTimeout.The value specified for the timeout parameter is not valid, possibly timeout is less than Zero or greater than InfiniteTimeout.

До истечения тайм-аута в очередь сообщений не поступало.A message did not arrive in the queue before the time-out expired.

- или --or-

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method

Примеры

Следующий пример кода получает сообщение из очереди и выводит сведения об этом сообщении на экран.The following code example receives a message from a queue and outputs information about that message to the screen. В этом примере выполнение приостанавливается до пяти секунд при ожидании поступления сообщения в очередь.The example pauses execution for up to five seconds while waiting for a message to arrive in the queue.

#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

Комментарии

Используйте эту перегрузку для получения сообщений и их возврата в течение указанного срока, если в очереди нет сообщений.Use this overload to receive a message and return in a specified period of time if there are no messages in the queue.

Метод Receive позволяет синхронно считывать сообщение, удаляя его из очереди.The Receive method allows for the synchronous reading of a message, removing it from the queue. Последующие вызовы Receive будут возвращать сообщения, следующие за очередью, или новые сообщения с более высоким приоритетом.Subsequent calls to Receive will return the messages that follow in the queue, or new, higher priority messages.

Чтобы прочитать первое сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read the first message in a queue without removing it from the queue, use the Peek method. Метод Peek всегда возвращает первое сообщение в очереди, поэтому последующие вызовы метода возвращают то же сообщение, если в очередь не поступает сообщение с более высоким приоритетом.The Peek method always returns the first message in the queue, so subsequent calls to the method return the same message unless a higher priority message arrives in the queue.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поток будет заблокирован на указанный период времени или неопределенное время, если указано значение InfiniteTimeout для параметра timeout.The thread will be blocked for the given period of time, or indefinitely if you specified the value InfiniteTimeout for the timeout parameter. Если обработка приложения должна продолжаться без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for a message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Дополнительно

Receive(TimeSpan, Cursor)

Получает текущее сообщение в очереди, используя заданный курсор.Receives the current message in the queue, using a specified cursor. Если доступных сообщений нет, этот метод ожидает, пока не станет доступным сообщение или пока не истечет тайм-аут.If no message is available, this method waits until either a message is available, or the time-out expires.

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

Параметры

timeout
TimeSpan

Структура TimeSpan, показывающая время ожидания нового сообщения для проверки.A TimeSpan that indicates the time to wait until a new message is available for inspection.

cursor
Cursor

Объект Cursor, который сохраняет определенное положение в очереди сообщений.A Cursor that maintains a specific position in the message queue.

Возвращаемое значение

Объект Message, ссылающийся на первое доступное в очереди сообщение.A Message that references the first message available in the queue.

Исключения

Для параметра timeout задано недопустимое значение; возможно, значение параметра timeout меньше Zero или больше InfiniteTimeout.The value specified for the timeout parameter is not valid, possibly timeout is less than Zero or greater than InfiniteTimeout.

До истечения тайм-аута в очередь сообщений не поступало.A message did not arrive in the queue before the time-out expired.

- или --or-

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method

Используйте эту перегрузку для получения сообщений и их возврата в течение указанного срока, если в очереди нет сообщений.Use this overload to receive a message and return in a specified period of time if there are no messages in the queue.

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Receive(TimeSpan, MessageQueueTransaction)

Получает первое сообщение, доступное в транзакционной очереди, на которую ссылается объект MessageQueue, и ожидает, пока в очереди не появится сообщение или пока не истечет тайм-аут.Receives the first message available in the transactional queue referenced by the MessageQueue and waits until either a message is available in the queue, or the time-out expires.

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

Параметры

timeout
TimeSpan

Структура TimeSpan, показывающая время ожидания нового сообщения для проверки.A TimeSpan that indicates the time to wait until a new message is available for inspection.

Возвращаемое значение

Объект Message, ссылающийся на первое доступное в очереди сообщение.A Message that references the first message available in the queue.

Исключения

Для параметра timeout задано недопустимое значение; возможно, значение параметра timeout меньше Zero или больше InfiniteTimeout.The value specified for the timeout parameter is not valid, possibly timeout is less than Zero or greater than InfiniteTimeout.

До истечения тайм-аута в очередь сообщений не поступало.A message did not arrive in the queue before the time-out expired.

- или --or-

Очередь является нетранзакционной.The queue is non-transactional.

- или --or-

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method.

Примеры

В следующем примере кода демонстрируется использование этого метода.The following code example demonstrates the use of this method.

#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

Комментарии

Используйте эту перегрузку для получения сообщения из транзакционной очереди с помощью контекста внутренней транзакции, определенного параметром transaction, и возврата в течение указанного периода времени, если в очереди нет сообщений.Use this overload to receive a message from a transactional queue using the internal transaction context defined by the transaction parameter, and return within a specified period of time if there are no messages in the queue.

Метод Receive позволяет синхронно считывать сообщения, тем самым удаляя его из очереди.The Receive method allows for the synchronous reading of a message, thereby removing it from the queue. Последующие вызовы Receive будут возвращать сообщения, следующие за очередью.Subsequent calls to Receive will return the messages that follow in the queue.

Поскольку этот метод вызывается для транзакционной очереди, полученное сообщение будет возвращено в очередь, если транзакция прервана.Because this method is called on a transactional queue, the message that is received would be returned to the queue if the transaction is aborted. Сообщение не удаляется навсегда из очереди до тех пор, пока транзакция не будет зафиксирована.The message is not permanently removed from the queue until the transaction is committed.

Чтобы прочитать первое сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read the first message in a queue without removing it from the queue, use the Peek method. Метод Peek всегда возвращает первое сообщение в очереди, поэтому последующие вызовы метода возвращают то же сообщение, если в очередь не поступает сообщение с более высоким приоритетом.The Peek method always returns the first message in the queue, so subsequent calls to the method return the same message unless a higher priority message arrives in the queue. Отсутствует контекст транзакции, связанный с сообщением, возвращенным вызовом Peek.There is no transaction context associated with a message returned by a call to Peek. Поскольку Peek не удаляет какие-либо сообщения в очереди, для отката вызовом функции Abortбудет нечего выполняться.Because Peek does not remove any messages in the queue, there would be nothing to roll back by a call to Abort.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поток будет заблокирован на указанный период времени или неопределенное время, если указано значение InfiniteTimeout для параметра timeout.The thread will be blocked for the given period of time, or indefinitely if you specified the value InfiniteTimeout for the timeout parameter. Если обработка приложения должна продолжаться без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for a message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Дополнительно

Receive(TimeSpan, MessageQueueTransactionType)

Получает первое доступное в очереди сообщение, на которое ссылается объект MessageQueue.Receives the first message available in the queue referenced by the MessageQueue. Данный вызов является синхронным, и он ожидает, пока в очереди не появится сообщение, или пока не истечет тайм-аут.This call is synchronous, and waits until either a message is available in the queue, or the time-out expires.

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

Параметры

timeout
TimeSpan

Структура TimeSpan, показывающая время ожидания нового сообщения для проверки.A TimeSpan that indicates the time to wait until a new message is available for inspection.

transactionType
MessageQueueTransactionType

Одно из значений MessageQueueTransactionType, описывающее тип контекста транзакции, связываемого с сообщением.One of the MessageQueueTransactionType values, describing the type of transaction context to associate with the message.

Возвращаемое значение

Объект Message, ссылающийся на первое доступное в очереди сообщение.A Message that references the first message available in the queue.

Исключения

Для параметра timeout задано недопустимое значение; возможно, значение параметра timeout меньше Zero или больше InfiniteTimeout.The value specified for the timeout parameter is not valid, possibly timeout is less than Zero or greater than InfiniteTimeout.

Параметр transactionType не является одним из членов MessageQueueTransactionType.The transactionType parameter is not one of the MessageQueueTransactionType members.

До истечения тайм-аута в очередь сообщений не поступало.A message did not arrive in the queue before the time-out expired.

- или --or-

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method.

Примеры

В следующем примере кода демонстрируется использование этого метода.The following code example demonstrates the use of this method.


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

Комментарии

Используйте эту перегрузку для получения сообщения из очереди с помощью контекста транзакции, определенного параметром transactionType, и возврата в указанный период времени, если в очереди нет сообщений.Use this overload to receive a message from a queue using a transaction context defined by the transactionType parameter, and return in a specified period of time if there are no messages in the queue.

Укажите Automatic для параметра transactionType, если к потоку, который требуется использовать для получения сообщения, уже присоединен контекст внешней транзакции.Specify Automatic for the transactionType parameter if there is already an external transaction context attached to the thread that you want to use to receive the message. Укажите Single, если вы хотите получить сообщение как одну внутреннюю транзакцию.Specify Single if you want to receive the message as a single internal transaction. Можно указать None, если требуется получить сообщение из транзакционной очереди за пределами контекста транзакции.You can specify None if you want to receive a message from a transactional queue outside of a transaction context.

Метод Receive позволяет синхронно считывать сообщения, тем самым удаляя его из очереди.The Receive method allows for the synchronous reading of a message, thereby removing it from the queue. Последующие вызовы Receive будут возвращать сообщения, следующие за очередью.Subsequent calls to Receive will return the messages that follow in the queue.

Если этот метод вызывается для получения сообщения из транзакционной очереди, полученное сообщение будет возвращено в очередь, если транзакция прервана.If this method is called to receive a message from a transactional queue, the message that is received would be returned to the queue if the transaction is aborted. Сообщение не удаляется навсегда из очереди до тех пор, пока транзакция не будет зафиксирована.The message is not permanently removed from the queue until the transaction is committed.

Чтобы прочитать первое сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read the first message in a queue without removing it from the queue, use the Peek method. Метод Peek всегда возвращает первое сообщение в очереди, поэтому последующие вызовы метода возвращают то же сообщение, если в очередь не поступает сообщение с более высоким приоритетом.The Peek method always returns the first message in the queue, so subsequent calls to the method return the same message unless a higher priority message arrives in the queue. Отсутствует контекст транзакции, связанный с сообщением, возвращенным вызовом Peek.There is no transaction context associated with a message returned by a call to Peek. Поскольку Peek не удаляет какие-либо сообщения в очереди, для отката вызовом функции Abortбудет нечего выполняться.Because Peek does not remove any messages in the queue, there would be nothing to roll back by a call to Abort.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поток будет заблокирован на указанный период времени или неопределенное время, если указано значение InfiniteTimeout для параметра timeout.The thread will be blocked for the given period of time, or indefinitely if you specified the value InfiniteTimeout for the timeout parameter. Если обработка приложения должна продолжаться без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for a message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Дополнительно

Receive(TimeSpan, Cursor, MessageQueueTransaction)

Получает текущее сообщение в очереди, используя заданный курсор.Receives the current message in the queue, using a specified cursor. Если доступных сообщений нет, этот метод ожидает, пока не станет доступным сообщение или пока не истечет тайм-аут.If no message is available, this method waits until either a message is available, or the time-out expires.

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

Параметры

timeout
TimeSpan

Структура TimeSpan, показывающая время ожидания нового сообщения для проверки.A TimeSpan that indicates the time to wait until a new message is available for inspection.

cursor
Cursor

Объект Cursor, который сохраняет определенное положение в очереди сообщений.A Cursor that maintains a specific position in the message queue.

Возвращаемое значение

Объект Message, ссылающийся на сообщение в очереди.A Message that references a message in the queue.

Исключения

Параметр cursor имеет значение null.The cursor parameter is null.

- или --or- Параметр transaction имеет значение null.The transaction parameter is null.

Значение, заданное для параметра timeout, недопустимо.The value specified for the timeout parameter is not valid. Возможно, значение параметра timeout меньше, чем Zero, или больше, чем InfiniteTimeout.Possibly timeout is less than Zero or greater than InfiniteTimeout.

До истечения тайм-аута в очередь сообщений не поступало.A message did not arrive in the queue before the time-out expired.

- или --or-

Очередь является нетранзакционной.The queue is non-transactional.

- или --or-

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method.

Комментарии

Используйте эту перегрузку для получения сообщения из транзакционной очереди с помощью контекста внутренней транзакции, определенного параметром transaction, и возврата в течение указанного периода времени, если в очереди нет сообщений.Use this overload to receive a message from a transactional queue using the internal transaction context defined by the transaction parameter, and return within a specified period of time if there are no messages in the queue.

Метод Receive позволяет синхронно считывать сообщения, тем самым удаляя его из очереди.The Receive method allows for the synchronous reading of a message, thereby removing it from the queue. Последующие вызовы Receive возвращают сообщения, следующие за очередью.Subsequent calls to Receive return the messages that follow in the queue.

Поскольку этот метод вызывается для транзакционной очереди, полученное сообщение возвращается в очередь, если транзакция прервана.Because this method is called on a transactional queue, the message that is received is returned to the queue if the transaction is aborted. Сообщение не удаляется навсегда из очереди до тех пор, пока транзакция не будет зафиксирована.The message is not permanently removed from the queue until the transaction is committed.

Чтобы прочитать сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read a message in a queue without removing it from the queue, use the Peek method. Отсутствует контекст транзакции, связанный с сообщением, возвращенным вызовом Peek.There is no transaction context associated with a message returned by a call to Peek. Поскольку Peek не удаляет какие-либо сообщения в очереди, нет никаких действий для отката путем вызова метода Abort.Because Peek does not remove any messages in the queue, there is nothing to roll back by a call to Abort.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поток заблокирован на указанный период времени или неопределенное время, если указано значение InfiniteTimeout для параметра timeout.The thread is blocked for the given period of time, or indefinitely if you specified the value InfiniteTimeout for the timeout parameter. Если обработка приложения должна продолжаться без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for a message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Дополнительно

Receive(TimeSpan, Cursor, MessageQueueTransactionType)

Получает текущее сообщение в очереди, используя заданный курсор.Receives the current message in the queue, using a specified cursor. Если доступных сообщений нет, этот метод ожидает, пока не станет доступным сообщение или пока не истечет тайм-аут.If no message is available, this method waits until either a message is available, or the time-out expires.

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

Параметры

timeout
TimeSpan

Структура TimeSpan, показывающая время ожидания нового сообщения для проверки.A TimeSpan that indicates the time to wait until a new message is available for inspection.

cursor
Cursor

Объект Cursor, который сохраняет определенное положение в очереди сообщений.A Cursor that maintains a specific position in the message queue.

transactionType
MessageQueueTransactionType

Одно из значений MessageQueueTransactionType, описывающее тип контекста транзакции, связываемого с сообщением.One of the MessageQueueTransactionType values that describes the type of transaction context to associate with the message.

Возвращаемое значение

Объект Message, ссылающийся на сообщение в очереди.A Message that references a message in the queue.

Исключения

Параметр cursor имеет значение null.The cursor parameter is null.

Значение, заданное для параметра timeout, недопустимо.The value specified for the timeout parameter is not valid. Возможно, значение параметра timeout меньше, чем Zero, или больше, чем InfiniteTimeout.Possibly timeout is less than Zero or greater than InfiniteTimeout.

Параметр transactionType не является одним из членов MessageQueueTransactionType.The transactionType parameter is not one of the MessageQueueTransactionType members.

До истечения тайм-аута в очередь сообщений не поступало.A message did not arrive in the queue before the time-out expired.

- или --or-

При обращении к методу службы очереди сообщений возникла ошибка.An error occurred when accessing a Message Queuing method.

Комментарии

Используйте эту перегрузку для получения сообщения из очереди с помощью контекста транзакции, определенного параметром transactionType, и возврата в указанный период времени, если в очереди нет сообщений.Use this overload to receive a message from a queue using a transaction context defined by the transactionType parameter, and return in a specified period of time if there are no messages in the queue.

Укажите Automatic для параметра transactionType, если к потоку, который требуется использовать для получения сообщения, уже присоединен контекст внешней транзакции.Specify Automatic for the transactionType parameter if there is already an external transaction context attached to the thread that you want to use to receive the message. Укажите Single, если вы хотите получить сообщение как одну внутреннюю транзакцию.Specify Single if you want to receive the message as a single internal transaction. Можно указать None, если требуется получить сообщение из транзакционной очереди за пределами контекста транзакции.You can specify None if you want to receive a message from a transactional queue outside of a transaction context.

Метод Receive позволяет синхронно считывать сообщения, тем самым удаляя его из очереди.The Receive method allows for the synchronous reading of a message, thereby removing it from the queue. Последующие вызовы Receive возвращают сообщения, следующие за очередью.Subsequent calls to Receive return the messages that follow in the queue.

Если этот метод вызывается для получения сообщения из транзакционной очереди, полученное сообщение возвращается в очередь, если транзакция прервана.If this method is called to receive a message from a transactional queue, the message that is received is returned to the queue if the transaction is aborted. Сообщение не удаляется навсегда из очереди до тех пор, пока транзакция не будет зафиксирована.The message is not permanently removed from the queue until the transaction is committed.

Чтобы прочитать сообщение в очереди, не удаляя его из очереди, используйте метод Peek.To read a message in a queue without removing it from the queue, use the Peek method. Отсутствует контекст транзакции, связанный с сообщением, возвращенным вызовом Peek.There is no transaction context associated with a message returned by a call to Peek. Поскольку Peek не удаляет какие-либо сообщения в очереди, нет никаких действий для отката путем вызова метода Abort.Because Peek does not remove any messages in the queue, there is nothing to roll back by a call to Abort.

Используйте вызов метода, Receive, если он приемлем для блокировки текущего потока, пока он ожидает поступления сообщения в очередь.Use a call to Receive when it is acceptable for the current thread to be blocked while it waits for a message to arrive in the queue. Поток заблокирован на указанный период времени или неопределенное время, если указано значение InfiniteTimeout для параметра timeout.The thread is blocked for the given period of time, or indefinitely if you specified the value InfiniteTimeout for the timeout parameter. Если обработка приложения должна продолжаться без ожидания сообщения, рассмотрите возможность использования асинхронного метода BeginReceive.If the application processing should continue without waiting for a message, consider using the asynchronous method, BeginReceive.

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.The following table shows whether this method is available in various Workgroup modes.

Режим рабочей группыWorkgroup mode ДоступноAvailable
Локальный компьютерLocal computer ДаYes
Локальный компьютер и прямое имя форматаLocal computer and direct format name ДаYes
Удаленный компьютерRemote computer НетNo
Удаленный компьютер и прямое имя форматаRemote computer and direct format name ДаYes

Потокобезопасность

Метод не является потокобезопасным.The method is not thread safe.

Дополнительно

Применяется к