Бөлісу құралы:


MessageQueue.BeginReceive Метод

Определение

Инициирует асинхронную операцию получения, сказав очередь сообщений, чтобы начать получение сообщения и уведомить обработчик событий по завершении.

Перегрузки

Имя Описание
BeginReceive()

Инициирует асинхронную операцию получения, которая не имеет времени ожидания. Операция не будет завершена, пока сообщение не станет доступным в очереди.

BeginReceive(TimeSpan)

Инициирует асинхронную операцию получения с указанным временем ожидания. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

BeginReceive(TimeSpan, Object)

Инициирует асинхронную операцию получения с заданным временем ожидания и заданным объектом состояния, который предоставляет связанные сведения в течение всего времени существования операции. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

BeginReceive(TimeSpan, Object, AsyncCallback)

Инициирует асинхронную операцию получения с заданным временем ожидания и заданным объектом состояния, который предоставляет связанные сведения в течение всего времени существования операции. Эта перегрузка получает уведомление через обратный вызов идентификатор обработчика событий для операции. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

BeginReceive(TimeSpan, Cursor, Object, AsyncCallback)

Инициирует асинхронную операцию получения с заданным временем ожидания и использует указанный курсор и указанный объект состояния. Объект состояния предоставляет связанные сведения в течение всего времени существования операции. Эта перегрузка получает уведомление через обратный вызов идентификатор обработчика событий для операции. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

BeginReceive()

Инициирует асинхронную операцию получения, которая не имеет времени ожидания. Операция не будет завершена, пока сообщение не станет доступным в очереди.

public:
 IAsyncResult ^ BeginReceive();
public IAsyncResult BeginReceive();
member this.BeginReceive : unit -> IAsyncResult
Public Function BeginReceive () As IAsyncResult

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

Объект IAsyncResult , определяющий опубликованный асинхронный запрос.

Исключения

Произошла ошибка при доступе к методу очереди сообщений.

Примеры

В следующем примере кода приводятся асинхронные запросы. Предполагается, что на локальном компьютере есть очередь с именем myQueue. Функция Main начинает асинхронную операцию, которая обрабатывается подпрограммой MyReceiveCompleted . MyReceiveCompleted обрабатывает текущее сообщение и начинает новую асинхронную операцию получения.

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

using namespace System;
using namespace System::Messaging;
using namespace System::Threading;

ref class MyNewQueue
{
public:

   // Define static class members.
   static ManualResetEvent^ signal = gcnew ManualResetEvent( false );
   static int count = 0;

   // Provides an event handler for the ReceiveCompleted
   // event.
   static void MyReceiveCompleted( Object^ source, ReceiveCompletedEventArgs^ asyncResult )
   {
      try
      {
         // Connect to the queue.
         MessageQueue^ mq = dynamic_cast<MessageQueue^>(source);

         // End the asynchronous receive operation.
         mq->EndReceive( asyncResult->AsyncResult );
         count += 1;
         if ( count == 10 )
         {
            signal->Set();
         }

         // Restart the asynchronous receive operation.
         mq->BeginReceive();
      }
      catch ( MessageQueueException^ ) 
      {
         // Handle sources of MessageQueueException.
      }

      // Handle other exceptions.
      return;
   }
};

// Provides an entry point into the application.
//         
// This example performs asynchronous receive
// operation processing.
int main()
{
   // Create an instance of MessageQueue. Set its formatter.
   MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );
   array<Type^>^p = gcnew array<Type^>(1);
   p[ 0 ] = String::typeid;
   myQueue->Formatter = gcnew XmlMessageFormatter( p );

   // Add an event handler for the ReceiveCompleted event.
   myQueue->ReceiveCompleted += gcnew ReceiveCompletedEventHandler( MyNewQueue::MyReceiveCompleted );

   // Begin the asynchronous receive operation.
   myQueue->BeginReceive();
   MyNewQueue::signal->WaitOne();

   // Do other work on the current thread.
   return 0;
}
using System;
using System.Messaging;
using System.Threading;

namespace MyProject
{
    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {
        // Define static class members.
        static ManualResetEvent signal = new ManualResetEvent(false);
        static int count = 0;

        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example performs asynchronous receive
        // operation processing.
        //**************************************************

        public static void Main()
        {
            // Create an instance of MessageQueue. Set its formatter.
            MessageQueue myQueue = new MessageQueue(".\\myQueue");
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(String)});

            // Add an event handler for the ReceiveCompleted event.
            myQueue.ReceiveCompleted +=
                new ReceiveCompletedEventHandler(MyReceiveCompleted);
            
            // Begin the asynchronous receive operation.
            myQueue.BeginReceive();

            signal.WaitOne();
            
            // Do other work on the current thread.

            return;
        }

        //***************************************************
        // Provides an event handler for the ReceiveCompleted
        // event.
        //***************************************************
        
        private static void MyReceiveCompleted(Object source,
            ReceiveCompletedEventArgs asyncResult)
        {
            try
            {
                // Connect to the queue.
                MessageQueue mq = (MessageQueue)source;

                // End the asynchronous receive operation.
                Message m = mq.EndReceive(asyncResult.AsyncResult);
                
                count += 1;
                if (count == 10)
                {
                    signal.Set();
                }

                // Restart the asynchronous receive operation.
                mq.BeginReceive();
            }
            catch(MessageQueueException)
            {
                // Handle sources of MessageQueueException.
            }
            
            // Handle other exceptions.
            
            return;
        }
    }
}
Imports System.Messaging
Imports System.Threading




' Provides a container class for the example.

Public Class MyNewQueue

        ' Define static class members.
        Private Shared signal As New ManualResetEvent(False)
        Private Shared count As Integer = 0



        ' Provides an entry point into the application.
        '		 
        ' This example performs asynchronous receive
        ' operation processing.


        Public Shared Sub Main()
            ' Create an instance of MessageQueue. Set its formatter.
            Dim myQueue As New MessageQueue(".\myQueue")
            myQueue.Formatter = New XmlMessageFormatter(New Type() _
                {GetType([String])})

            ' Add an event handler for the ReceiveCompleted event.
            AddHandler myQueue.ReceiveCompleted, AddressOf _
                MyReceiveCompleted

            ' Begin the asynchronous receive operation.
            myQueue.BeginReceive()

            signal.WaitOne()

            ' Do other work on the current thread.

            Return

        End Sub



        ' Provides an event handler for the ReceiveCompleted
        ' event.


        Private Shared Sub MyReceiveCompleted(ByVal [source] As _
            [Object], ByVal asyncResult As ReceiveCompletedEventArgs)

            Try
                ' Connect to the queue.
                Dim mq As MessageQueue = CType([source], MessageQueue)

                ' End the asynchronous receive operation.
                Dim m As Message = _
                    mq.EndReceive(asyncResult.AsyncResult)

                count += 1
                If count = 10 Then
                    signal.Set()
                End If

                ' Restart the asynchronous receive operation.
                mq.BeginReceive()

            Catch
                ' Handle sources of MessageQueueException.

                ' Handle other exceptions.

            End Try

            Return

        End Sub

End Class

В следующем примере кода очереди асинхронных запросов. Вызов, который BeginReceive будет использоваться в возвращаемом AsyncWaitHandle значении. Подпрограмма Main ожидает завершения всех асинхронных операций перед выходом.

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

using namespace System;
using namespace System::Messaging;
using namespace System::Threading;

ref class MyNewQueue
{
public:

   // Provides an event handler for the ReceiveCompleted
   // event.
   static void MyReceiveCompleted( Object^ source, ReceiveCompletedEventArgs^ asyncResult )
   {
      try
      {
         // Connect to the queue.
         MessageQueue^ mq = dynamic_cast<MessageQueue^>(source);

         // End the asynchronous receive operation.
         mq->EndReceive( asyncResult->AsyncResult );

         // Process the message here.
         Console::WriteLine( "Message received." );
      }
      catch ( MessageQueueException^ ) 
      {
         // Handle sources of MessageQueueException.
      }
      // Handle other exceptions.
      return;
   }
};

// Provides an entry point into the application.
//         
// This example performs asynchronous receive
// operation processing.
int main()
{
   // Create an instance of MessageQueue. Set its formatter.
   MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );
   array<Type^>^p = gcnew array<Type^>(1);
   p[ 0 ] = String::typeid;
   myQueue->Formatter = gcnew XmlMessageFormatter( p );

   // Add an event handler for the ReceiveCompleted event.
   myQueue->ReceiveCompleted += gcnew ReceiveCompletedEventHandler( MyNewQueue::MyReceiveCompleted );

   // Define wait handles for multiple operations.
   array<WaitHandle^>^waitHandleArray = gcnew array<WaitHandle^>(10);
   for ( int i = 0; i < 10; i++ )
   {
      // Begin asynchronous operations.
      waitHandleArray[ i ] = myQueue->BeginReceive()->AsyncWaitHandle;
   }

   // Specify to wait for all operations to return.
   WaitHandle::WaitAll( waitHandleArray );
   return 0;
}
using System;
using System.Messaging;
using System.Threading;

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

        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example performs asynchronous receive
        // operation processing.
        //**************************************************

        public static void Main()
        {
            // Create an instance of MessageQueue. Set its formatter.
            MessageQueue myQueue = new MessageQueue(".\\myQueue");
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(String)});

            // Add an event handler for the ReceiveCompleted event.
            myQueue.ReceiveCompleted +=
                new ReceiveCompletedEventHandler(MyReceiveCompleted);
            
            // Define wait handles for multiple operations.
            WaitHandle[] waitHandleArray = new WaitHandle[10];
            for(int i=0; i<10; i++)
            {
                // Begin asynchronous operations.
                waitHandleArray[i] =
                    myQueue.BeginReceive().AsyncWaitHandle;
            }

            // Specify to wait for all operations to return.
            WaitHandle.WaitAll(waitHandleArray);

            return;
        }

        //***************************************************
        // Provides an event handler for the ReceiveCompleted
        // event.
        //***************************************************
        
        private static void MyReceiveCompleted(Object source,
            ReceiveCompletedEventArgs asyncResult)
        {
            try
            {
                // Connect to the queue.
                MessageQueue mq = (MessageQueue)source;

                // End the asynchronous receive operation.
                Message m = mq.EndReceive(asyncResult.AsyncResult);
        
                // Process the message here.
                Console.WriteLine("Message received.");
            }
            catch(MessageQueueException)
            {
                // Handle sources of MessageQueueException.
            }
            
            // Handle other exceptions.
            
            return;
        }
    }
}
Imports System.Messaging
Imports System.Threading


' Provides a container class for the example.

Public Class MyNewQueue


        ' Provides an entry point into the application.
        '		 
        ' This example performs asynchronous receive
        ' operation processing.


        Public Shared Sub Main()

            ' Create an instance of MessageQueue. Set its formatter.
            Dim myQueue As New MessageQueue(".\myQueue")
            myQueue.Formatter = New XmlMessageFormatter(New Type() _
                {GetType([String])})

            ' Add an event handler for the ReceiveCompleted event.
            AddHandler myQueue.ReceiveCompleted, AddressOf _
                MyReceiveCompleted

            ' Define wait handles for multiple operations.
            Dim waitHandleArray(10) As WaitHandle

            Dim i As Integer
            For i = 0 To 9
                ' Begin asynchronous operations.
                waitHandleArray(i) = _
                    myQueue.BeginReceive().AsyncWaitHandle
            Next i

            ' Specify to wait for all operations to return.
            WaitHandle.WaitAll(waitHandleArray)

            Return

        End Sub



        ' Provides an event handler for the ReceiveCompleted
        ' event.


        Private Shared Sub MyReceiveCompleted(ByVal [source] As _
            [Object], ByVal asyncResult As ReceiveCompletedEventArgs)

            Try
                ' Connect to the queue.
                Dim mq As MessageQueue = CType([source], MessageQueue)

                ' End the asynchronous receive operation.
                Dim m As Message = _
                    mq.EndReceive(asyncResult.AsyncResult)

                ' Process the message here.
                Console.WriteLine("Message received.")

            Catch

                ' Handle sources of MessageQueueException.

                ' Handle other exceptions.

            End Try

            Return

        End Sub

End Class

Комментарии

При асинхронной обработке событие создается BeginReceiveReceiveCompleted при удалении сообщения из очереди.

ReceiveCompleted также вызывается, если сообщение уже существует в очереди.

Чтобы использовать BeginReceive, создайте обработчик событий, который обрабатывает результаты асинхронной операции и связывает его с делегатом события. BeginReceive инициирует асинхронную операцию получения; MessageQueue уведомление по ReceiveCompleted вызову события при поступлении сообщения в очередь. Затем MessageQueue он может получить доступ к сообщению путем вызова EndReceive(IAsyncResult).

Метод BeginReceive возвращается немедленно, но асинхронная операция не завершается до вызова обработчика событий.

Так как BeginReceive это асинхронно, его можно вызвать для получения сообщения из очереди, не блокируя текущий поток выполнения. Чтобы синхронно получить сообщение, используйте Receive метод.

После завершения асинхронной операции можно вызвать BeginPeek или BeginReceive еще раз в обработчике событий, чтобы сохранить получение уведомлений.

BeginReceive Возвращает IAsyncResult асинхронную операцию, запущенную методом. Это можно использовать IAsyncResult на протяжении всего времени существования операции, хотя обычно его не следует использовать до EndReceive(IAsyncResult) вызова. Однако при запуске нескольких асинхронных операций можно поместить их IAsyncResult значения в массив и указать, следует ли ожидать завершения всех операций или любой операции. В этом случае используется AsyncWaitHandle свойство для идентификации IAsyncResult завершенной операции.

Если CanRead это falseтак, вызывается событие завершения, но при вызове EndReceive(IAsyncResult)возникает исключение.

Не используйте асинхронный вызов BeginReceive с транзакциями. Если вы хотите выполнить асинхронную операцию транзакций, вызвать BeginPeekи поместить транзакцию и метод (синхронный) Receive в обработчик событий, который вы создаете для операции просмотра. Обработчик событий может содержать функциональные возможности, как показано в следующем коде C#.

myMessageQueue.BeginTransaction();
 myMessageQueue.Receive();
 myMessageQueue.CommitTransaction();

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.

Режим рабочей группы В наличии
Локальный компьютер Да
Имя локального компьютера и прямого формата Да
Удаленный компьютер Нет
Имя удаленного компьютера и прямого формата Да

См. также раздел

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

BeginReceive(TimeSpan)

Инициирует асинхронную операцию получения с указанным временем ожидания. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

public:
 IAsyncResult ^ BeginReceive(TimeSpan timeout);
public IAsyncResult BeginReceive(TimeSpan timeout);
member this.BeginReceive : TimeSpan -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan) As IAsyncResult

Параметры

timeout
TimeSpan

Значение, TimeSpan указывающее интервал времени ожидания появления сообщения.

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

Объект IAsyncResult , определяющий опубликованный асинхронный запрос.

Исключения

Значение, указанное для timeout параметра, недопустимо, возможно, потому что оно представляет отрицательное число.

Произошла ошибка при доступе к методу очереди сообщений.

Примеры

В следующем примере кода создается асинхронная операция получения. Пример кода создает обработчик MyReceiveCompletedсобытий и присоединяет его к делегату обработчика ReceiveCompleted событий. В примере кода отправляется сообщение в локальную очередь сообщений, а затем вызывается BeginReceive(TimeSpan), передавая значение времени ожидания в течение десяти секунд. ReceiveCompleted При возникновении события обработчик событий получает сообщение и записывает текст сообщения на экран.

#using <System.Messaging.dll>
#using <System.dll>

using namespace System;
using namespace System::Messaging;

// Creates a new queue.
void CreateQueue(String^ queuePath, bool transactional)
{
    if(!MessageQueue::Exists(queuePath))
    {
        MessageQueue^ queue = MessageQueue::Create(queuePath, transactional);
        queue->Close();       
    }
    else
    {
        Console::WriteLine("{0} already exists.", queuePath);
    }
}

// Provides an event handler for the ReceiveCompleted event.
void HandleReceiveCompleted(Object^ source, ReceiveCompletedEventArgs^ e)
{
    // Connect to the queue.
    MessageQueue^ queue = (MessageQueue^)source;

    // End the asynchronous receive operation.
    Message^ msg = queue->EndReceive(e->AsyncResult);

    // Display the message information on the screen.
    Console::WriteLine("Message body: {0}", msg->Body);
    
    queue->Close();
}

int main()
{
    // Create a non-transactional queue on the local computer.
    // Note that the queue might not be immediately accessible, and
    // therefore this example might throw an exception of type
    // System.Messaging.MessageQueueException when trying to send a
    // message to the newly created queue.
    MessageQueue^ queue = nullptr;
    try
    {
        CreateQueue(".\\exampleQueue", false);

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

        // Add an event handler for the ReceiveCompleted event.
        queue->ReceiveCompleted += gcnew
            ReceiveCompletedEventHandler(HandleReceiveCompleted);

        // Send a message to the queue.
        queue->Send("Example Message");

        // Begin the asynchronous receive operation.
        queue->BeginReceive(TimeSpan::FromSeconds(10.0));

        // Simulate doing other work on the current thread.
        System::Threading::Thread::Sleep(TimeSpan::FromSeconds(10.0));
    }

    catch (InvalidOperationException^)
    {
        Console::WriteLine("Please install Message Queuing.");
    }

    catch (MessageQueueException^ ex)
    {
        Console::WriteLine(ex->Message);
    }

    finally
    {   
        queue->Close();
    }

}

using System;
using System.Messaging;

public class QueueExample
{
    public static void Main()
    {
        // Create a non-transactional queue on the local computer.
        // Note that the queue might not be immediately accessible, and
        // therefore this example might throw an exception of type
        // System.Messaging.MessageQueueException when trying to send a
        // message to the newly created queue.
        CreateQueue(".\\exampleQueue", false);

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

        // Add an event handler for the ReceiveCompleted event.
        queue.ReceiveCompleted += new
                ReceiveCompletedEventHandler(MyReceiveCompleted);

        // Send a message to the queue.
        queue.Send("Example Message");

        // Begin the asynchronous receive operation.
        queue.BeginReceive(TimeSpan.FromSeconds(10.0));

        // Simulate doing other work on the current thread.
        System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0));

        return;
    }

    // Creates a new queue.
    public static void CreateQueue(string queuePath, bool transactional)
    {
        if(!MessageQueue.Exists(queuePath))
        {
            MessageQueue.Create(queuePath, transactional);
        }
        else
        {
            Console.WriteLine(queuePath + " already exists.");
        }
    }

    // Provides an event handler for the ReceiveCompleted event.
    private static void MyReceiveCompleted(Object source,
        ReceiveCompletedEventArgs asyncResult)
    {
        // Connect to the queue.
        MessageQueue queue = (MessageQueue)source;

        // End the asynchronous receive operation.
        Message msg = queue.EndReceive(asyncResult.AsyncResult);

        // Display the message information on the screen.
        Console.WriteLine("Message body: {0}", (string)msg.Body);
    }
}

Комментарии

При асинхронной обработке событие используется BeginReceive для создания ReceiveCompleted события, когда сообщение становится доступным в очереди или когда истек указанный интервал времени.

ReceiveCompleted также вызывается, если сообщение уже существует в очереди.

Чтобы использовать BeginReceive, создайте обработчик событий, который обрабатывает результаты асинхронной операции и связывает его с делегатом события. BeginReceive инициирует асинхронную операцию получения; MessageQueue уведомление по ReceiveCompleted вызову события при поступлении сообщения в очередь. Затем MessageQueue он может получить доступ к сообщению, вызвав EndReceive(IAsyncResult) или получите результат с помощью .ReceiveCompletedEventArgs

Метод BeginReceive возвращается немедленно, но асинхронная операция не завершается до вызова обработчика событий.

Так как BeginReceive это асинхронно, его можно вызвать для получения сообщения из очереди, не блокируя текущий поток выполнения. Чтобы синхронно получить сообщение, используйте Receive метод.

После завершения асинхронной операции можно вызвать BeginPeek или BeginReceive еще раз в обработчике событий, чтобы сохранить получение уведомлений.

Если CanRead это falseтак, вызывается событие завершения, но при вызове EndReceive(IAsyncResult)возникает исключение.

BeginReceive Возвращает IAsyncResult асинхронную операцию, запущенную методом. Это можно использовать IAsyncResult на протяжении всего времени существования операции, хотя обычно его не следует использовать до EndReceive(IAsyncResult) вызова. Однако при запуске нескольких асинхронных операций можно поместить их IAsyncResult значения в массив и указать, следует ли ожидать завершения всех операций или любой операции. В этом случае используется AsyncWaitHandle свойство для идентификации IAsyncResult завершенной операции.

Эта перегрузка задает время ожидания. Если истекает интервал, указанный параметром timeout , этот компонент вызывает ReceiveCompleted событие. Так как сообщение не существует, последующий вызов EndReceive(IAsyncResult) вызывает исключение.

Не используйте асинхронный вызов BeginReceive с транзакциями. Если вы хотите выполнить асинхронную операцию транзакций, вызвать BeginPeekи поместить транзакцию и метод (синхронный) Receive в обработчик событий, который вы создаете для операции просмотра. Обработчик событий может содержать функциональные возможности, как показано в следующем коде C#.

myMessageQueue.BeginTransaction();
 myMessageQueue.Receive();
 myMessageQueue.CommitTransaction();

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.

Режим рабочей группы В наличии
Локальный компьютер Да
Имя локального компьютера и прямого формата Да
Удаленный компьютер Нет
Имя удаленного компьютера и прямого формата Да

См. также раздел

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

BeginReceive(TimeSpan, Object)

Инициирует асинхронную операцию получения с заданным временем ожидания и заданным объектом состояния, который предоставляет связанные сведения в течение всего времени существования операции. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

public:
 IAsyncResult ^ BeginReceive(TimeSpan timeout, System::Object ^ stateObject);
public IAsyncResult BeginReceive(TimeSpan timeout, object stateObject);
member this.BeginReceive : TimeSpan * obj -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan, stateObject As Object) As IAsyncResult

Параметры

timeout
TimeSpan

Значение, TimeSpan указывающее интервал времени ожидания появления сообщения.

stateObject
Object

Объект состояния, указанный приложением, содержащий сведения, связанные с асинхронной операцией.

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

Объект IAsyncResult , определяющий опубликованный асинхронный запрос.

Исключения

Для параметра timeout указано недопустимое значение.

Произошла ошибка при доступе к методу очереди сообщений.

Примеры

В следующем примере кода создается асинхронная операция получения. Пример кода создает обработчик MyReceiveCompletedсобытий и присоединяет его к делегату обработчика ReceiveCompleted событий. В примере кода отправляется сообщение в локальную очередь сообщений, а затем вызывается BeginReceive(TimeSpan, Object), передавая значение времени ожидания в течение десяти секунд и уникальное целое число, определяющее конкретное сообщение. ReceiveCompleted При возникновении события обработчик событий получает сообщение и записывает текст сообщения и идентификатор целочисленного сообщения на экран.

#using <System.Messaging.dll>
#using <System.dll>

using namespace System;
using namespace System::Messaging;

// Creates a new queue.
void CreateQueue(String^ queuePath, bool transactional)
{
    if(!MessageQueue::Exists(queuePath))
    {
        MessageQueue^ queue = MessageQueue::Create(queuePath, transactional);
        queue->Close();       
    }
    else
    {
        Console::WriteLine("{0} already exists.", queuePath);
    }
}

// Provides an event handler for the ReceiveCompleted event.
void HandleReceiveCompleted(Object^ source, ReceiveCompletedEventArgs^ e)
{
    // Connect to the queue.
    MessageQueue^ queue = (MessageQueue^)source;

    // End the asynchronous receive operation.
    Message^ msg = queue->EndReceive(e->AsyncResult);

    // Display the message information on the screen.
    Console::WriteLine("Message number: {0}", e->AsyncResult->AsyncState);
    Console::WriteLine("Message body: {0}", msg->Body);

    queue->Close();
}

int main()
{
    // Create a non-transactional queue on the local computer.
    // Note that the queue might not be immediately accessible, and
    // therefore this example might throw an exception of type
    // System.Messaging.MessageQueueException when trying to send a
    // message to the newly created queue.
    MessageQueue^ queue = nullptr;

    // Represents a state object associated with each message.
    int messageNumber = 0;

    try
    {
        CreateQueue(".\\exampleQueue", false);

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

        // Add an event handler for the ReceiveCompleted event.
        queue->ReceiveCompleted += gcnew
            ReceiveCompletedEventHandler(HandleReceiveCompleted);

        // Send a message to the queue.
        queue->Send("Example Message");

        // Begin the asynchronous receive operation.
        queue->BeginReceive(TimeSpan::FromSeconds(10.0), messageNumber++);

        // Simulate doing other work on the current thread.
        System::Threading::Thread::Sleep(TimeSpan::FromSeconds(10.0));
    }
    catch (InvalidOperationException^)
    {
        Console::WriteLine("Please install Message Queuing.");
    }

    catch (MessageQueueException^ ex)
    {
        Console::WriteLine(ex->Message);
    }

    finally
    {   
        queue->Close();
    }
}

using System;
using System.Messaging;

public class QueueExample
{
    // Represents a state object associated with each message.
    static int messageNumber = 0;

    public static void Main()
    {
        // Create a non-transactional queue on the local computer.
        // Note that the queue might not be immediately accessible, and
        // therefore this example might throw an exception of type
        // System.Messaging.MessageQueueException when trying to send a
        // message to the newly created queue.
        CreateQueue(".\\exampleQueue", false);

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

        // Add an event handler for the ReceiveCompleted event.
        queue.ReceiveCompleted += new
            ReceiveCompletedEventHandler(MyReceiveCompleted);

        // Send a message to the queue.
        queue.Send("Example Message");

        // Begin the asynchronous receive operation.
        queue.BeginReceive(TimeSpan.FromSeconds(10.0), messageNumber++);

        // Simulate doing other work on the current thread.
        System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0));

        return;
    }

    // Creates a new queue.
    public static void CreateQueue(string queuePath, bool transactional)
    {
        if(!MessageQueue.Exists(queuePath))
        {
            MessageQueue.Create(queuePath, transactional);
        }
        else
        {
            Console.WriteLine(queuePath + " already exists.");
        }
    }

    // Provides an event handler for the ReceiveCompleted event.
    private static void MyReceiveCompleted(Object source,
        ReceiveCompletedEventArgs asyncResult)
    {
        // Connect to the queue.
        MessageQueue queue = (MessageQueue)source;

        // End the asynchronous receive operation.
        Message msg = queue.EndReceive(asyncResult.AsyncResult);

        // Display the message information on the screen.
        Console.WriteLine("Message number: {0}",
            (int)asyncResult.AsyncResult.AsyncState);
        Console.WriteLine("Message body: {0}", (string)msg.Body);
    }
}

Комментарии

При асинхронной обработке событие используется BeginReceive для создания ReceiveCompleted события, когда сообщение становится доступным в очереди или когда истек указанный интервал времени.

ReceiveCompleted также вызывается, если сообщение уже существует в очереди.

Используйте эту перегрузку для связывания сведений с операцией, которая будет сохранена на протяжении всего времени существования операции. Обработчик событий может обнаружить эти сведения, просмотрев AsyncState свойство связанного IAsyncResult с операцией.

Чтобы использовать BeginReceive, создайте обработчик событий, который обрабатывает результаты асинхронной операции и связывает его с делегатом события. BeginReceive инициирует асинхронную операцию получения; MessageQueue уведомление по ReceiveCompleted вызову события при поступлении сообщения в очередь. Затем MessageQueue он может получить доступ к сообщению, вызвав EndReceive(IAsyncResult) или получите результат с помощью .ReceiveCompletedEventArgs

Метод BeginReceive возвращается немедленно, но асинхронная операция не завершается до вызова обработчика событий.

Так как BeginReceive это асинхронно, его можно вызвать для получения сообщения из очереди, не блокируя текущий поток выполнения. Чтобы синхронно получить сообщение, используйте Receive метод.

После завершения асинхронной операции можно вызвать BeginPeek или BeginReceive еще раз в обработчике событий, чтобы сохранить получение уведомлений.

BeginReceive Возвращает IAsyncResult асинхронную операцию, запущенную методом. Это можно использовать IAsyncResult на протяжении всего времени существования операции, хотя обычно его не следует использовать до EndReceive(IAsyncResult) вызова. Однако при запуске нескольких асинхронных операций можно поместить их IAsyncResult значения в массив и указать, следует ли ожидать завершения всех операций или любой операции. В этом случае используется AsyncWaitHandle свойство для идентификации IAsyncResult завершенной операции.

Эта перегрузка задает время ожидания и объект состояния. Если истекает интервал, указанный параметром timeout , этот компонент вызывает ReceiveCompleted событие. Так как сообщение не существует, последующий вызов EndReceive(IAsyncResult) вызывает исключение.

Объект состояния связывает сведения о состоянии с операцией. Например, при вызове BeginReceive нескольких раз для запуска нескольких операций можно определить каждую операцию с помощью определенного объекта состояния.

Можно также использовать объект состояния для передачи информации в потоках обработки. Если поток запущен, но обратный вызов находится в другом потоке в асинхронном сценарии, объект состояния маршалируется и передается обратно вместе с информацией из события.

Не используйте асинхронный вызов BeginReceive с транзакциями. Если вы хотите выполнить асинхронную операцию транзакций, вызвать BeginPeekи поместить транзакцию и метод (синхронный) Receive в обработчик событий, который вы создаете для операции просмотра. Обработчик событий может содержать функциональные возможности, как показано в следующем коде C#.

myMessageQueue.BeginTransaction();
 myMessageQueue.Receive();
 myMessageQueue.CommitTransaction();

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.

Режим рабочей группы В наличии
Локальный компьютер Да
Имя локального компьютера и прямого формата Да
Удаленный компьютер Нет
Имя удаленного компьютера и прямого формата Да

См. также раздел

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

BeginReceive(TimeSpan, Object, AsyncCallback)

Инициирует асинхронную операцию получения с заданным временем ожидания и заданным объектом состояния, который предоставляет связанные сведения в течение всего времени существования операции. Эта перегрузка получает уведомление через обратный вызов идентификатор обработчика событий для операции. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

public:
 IAsyncResult ^ BeginReceive(TimeSpan timeout, System::Object ^ stateObject, AsyncCallback ^ callback);
public IAsyncResult BeginReceive(TimeSpan timeout, object stateObject, AsyncCallback callback);
member this.BeginReceive : TimeSpan * obj * AsyncCallback -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan, stateObject As Object, callback As AsyncCallback) As IAsyncResult

Параметры

timeout
TimeSpan

Значение, TimeSpan указывающее интервал времени ожидания появления сообщения.

stateObject
Object

Объект состояния, указанный приложением, содержащий сведения, связанные с асинхронной операцией.

callback
AsyncCallback

Уведомление AsyncCallback о завершении асинхронной операции будет получено.

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

Объект IAsyncResult , определяющий опубликованный асинхронный запрос.

Исключения

Для параметра timeout указано недопустимое значение.

Произошла ошибка при доступе к методу очереди сообщений.

Примеры

В следующем примере кода создается асинхронная операция получения. В примере кода отправляется сообщение в локальную очередь сообщений, а затем вызываетсяBeginReceive(TimeSpan, Object, AsyncCallback), передавая: время ожидания в десять секунд; уникальное целое число, определяющее конкретное сообщение; и новый экземплярAsyncCallback, определяющий обработчик событий. MyReceiveCompleted ReceiveCompleted При возникновении события обработчик событий получает сообщение и записывает текст сообщения и идентификатор целочисленного сообщения на экран.

#using <System.Messaging.dll>
#using <System.dll>

using namespace System;
using namespace System::Messaging;

// Creates a new queue.
void CreateQueue(String^ queuePath, bool transactional)
{
    if (!MessageQueue::Exists(queuePath))
    {
        MessageQueue^ queue = MessageQueue::Create(queuePath, transactional);
        queue->Close();       
    }
    else
    {
        Console::WriteLine("{0} already exists.", queuePath);
    }
}

// Provides an event handler for the ReceiveCompleted event.
void HandleReceiveCompleted(IAsyncResult^ asyncResult)
{
    // Connect to the queue.
    MessageQueue^ queue = gcnew MessageQueue(".\\exampleQueue");

    // End the asynchronous receive operation.
    Message^ msg = queue->EndReceive(asyncResult);

    // Display the message information on the screen.
    Console::WriteLine("Message number: {0}", asyncResult->AsyncState);
    Console::WriteLine("Message body: {0}", msg->Body);

    queue->Close();
}

int main()
{
    // Represents a state object associated with each message.
    int messageNumber = 0;

    // Create a non-transactional queue on the local computer.
    // Note that the queue might not be immediately accessible, and
    // therefore this example might throw an exception of type
    // System.Messaging.MessageQueueException when trying to send a
    // message to the newly created queue.
    MessageQueue^ queue = nullptr;
    try
    {
        CreateQueue(".\\exampleQueue", false);

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

        // Send a message to the queue.
        queue->Send("Example Message");

        // Begin the asynchronous receive operation.
        queue->BeginReceive(TimeSpan::FromSeconds(10.0), messageNumber++,
            gcnew AsyncCallback(HandleReceiveCompleted));

        // Simulate doing other work on the current thread.
        System::Threading::Thread::Sleep(TimeSpan::FromSeconds(10.0));
    }
    catch (InvalidOperationException^)
    {
        Console::WriteLine("Please install Message Queuing.");
    }

    catch (MessageQueueException^ ex)
    {
        Console::WriteLine(ex->Message);
    }

    finally
    {   
        queue->Close();
    }
}

using System;
using System.Messaging;

public class QueueExample
{
    // Represents a state object associated with each message.
    static int messageNumber = 0;

    public static void Main()
    {
        // Create a non-transactional queue on the local computer.
        // Note that the queue might not be immediately accessible, and
        // therefore this example might throw an exception of type
        // System.Messaging.MessageQueueException when trying to send a
        // message to the newly created queue.
        CreateQueue(".\\exampleQueue", false);

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

        // Send a message to the queue.
        queue.Send("Example Message");

        // Begin the asynchronous receive operation.
        queue.BeginReceive(TimeSpan.FromSeconds(10.0), messageNumber++,
            new AsyncCallback(MyReceiveCompleted));
            
        // Simulate doing other work on the current thread.
        System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0));

        return;
    }

    // Creates a new queue.
    public static void CreateQueue(string queuePath, bool transactional)
    {
        if(!MessageQueue.Exists(queuePath))
        {
            MessageQueue.Create(queuePath, transactional);
        }
        else
        {
            Console.WriteLine(queuePath + " already exists.");
        }
    }

    // Provides an event handler for the ReceiveCompleted event.
    private static void MyReceiveCompleted(IAsyncResult asyncResult)
    {
        // Connect to the queue.
        MessageQueue queue = new MessageQueue(".\\exampleQueue");

        // End the asynchronous receive operation.
        Message msg = queue.EndReceive(asyncResult);

        // Display the message information on the screen.
        Console.WriteLine("Message number: {0}", (int)asyncResult.AsyncState);
        Console.WriteLine("Message body: {0}", (string)msg.Body);
    }
}

Комментарии

При использовании этой перегрузки обратный вызов, указанный в параметре обратного вызова, вызывается непосредственно, когда сообщение становится доступным в очереди или когда истек указанный интервал времени; ReceiveCompleted Событие не вызывается. Другие перегрузки BeginReceive , зависящие от этого компонента, вызывают ReceiveCompleted событие.

ReceiveCompleted также вызывается, если сообщение уже существует в очереди.

Чтобы использовать BeginReceive, создайте обработчик событий, который обрабатывает результаты асинхронной операции и связывает его с делегатом события. BeginReceive инициирует асинхронную операцию получения; MessageQueue уведомление по ReceiveCompleted вызову события при поступлении сообщения в очередь. Затем MessageQueue он может получить доступ к сообщению, вызвав EndReceive(IAsyncResult) или получите результат с помощью .ReceiveCompletedEventArgs

Метод BeginReceive возвращается немедленно, но асинхронная операция не завершается до вызова обработчика событий.

Так как BeginReceive это асинхронно, его можно вызвать для получения сообщения из очереди, не блокируя текущий поток выполнения. Чтобы синхронно получить сообщение, используйте Receive метод.

После завершения асинхронной операции можно вызвать BeginPeek или BeginReceive еще раз в обработчике событий, чтобы сохранить получение уведомлений.

BeginReceive Возвращает IAsyncResult асинхронную операцию, запущенную методом. Это можно использовать IAsyncResult на протяжении всего времени существования операции, хотя обычно его не следует использовать до EndReceive(IAsyncResult) вызова. Однако при запуске нескольких асинхронных операций можно поместить их IAsyncResult значения в массив и указать, следует ли ожидать завершения всех операций или любой операции. В этом случае используется AsyncWaitHandle свойство для идентификации IAsyncResult завершенной операции.

Объект состояния связывает сведения о состоянии с операцией. Например, при вызове BeginReceive нескольких раз для запуска нескольких операций можно определить каждую операцию с помощью определенного объекта состояния.

Можно также использовать объект состояния для передачи информации в потоках обработки. Если поток запущен, но обратный вызов находится в другом потоке в асинхронном сценарии, объект состояния маршалируется и передается обратно вместе с информацией из события.

Не используйте асинхронный вызов BeginReceive с транзакциями. Если вы хотите выполнить асинхронную операцию транзакций, вызвать BeginPeekи поместить транзакцию и метод (синхронный) Receive в обработчик событий, который вы создаете для операции просмотра. Обработчик событий может содержать функциональные возможности, как показано в следующем коде C#.

myMessageQueue.BeginTransaction();
 myMessageQueue.Receive();
 myMessageQueue.CommitTransaction();

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.

Режим рабочей группы В наличии
Локальный компьютер Да
Имя локального компьютера и прямого формата Да
Удаленный компьютер Нет
Имя удаленного компьютера и прямого формата Да

См. также раздел

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

BeginReceive(TimeSpan, Cursor, Object, AsyncCallback)

Инициирует асинхронную операцию получения с заданным временем ожидания и использует указанный курсор и указанный объект состояния. Объект состояния предоставляет связанные сведения в течение всего времени существования операции. Эта перегрузка получает уведомление через обратный вызов идентификатор обработчика событий для операции. Операция не завершается до тех пор, пока сообщение не станет доступным в очереди или время ожидания.

public:
 IAsyncResult ^ BeginReceive(TimeSpan timeout, System::Messaging::Cursor ^ cursor, System::Object ^ state, AsyncCallback ^ callback);
public IAsyncResult BeginReceive(TimeSpan timeout, System.Messaging.Cursor cursor, object state, AsyncCallback callback);
member this.BeginReceive : TimeSpan * System.Messaging.Cursor * obj * AsyncCallback -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan, cursor As Cursor, state As Object, callback As AsyncCallback) As IAsyncResult

Параметры

timeout
TimeSpan

Значение, TimeSpan указывающее интервал времени ожидания появления сообщения.

cursor
Cursor

Объект, Cursor поддерживающий определенную позицию в очереди сообщений.

state
Object

Объект состояния, указанный приложением, содержащий сведения, связанные с асинхронной операцией.

callback
AsyncCallback

Получает AsyncCallback уведомление о завершении асинхронной операции.

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

Объект IAsyncResult , определяющий опубликованный асинхронный запрос.

Исключения

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

Для параметра timeout указано недопустимое значение.

Произошла ошибка при доступе к методу очереди сообщений.

Комментарии

При использовании этой перегрузки обратный вызов, указанный в параметре обратного вызова, вызывается непосредственно, когда сообщение становится доступным в очереди или когда истек указанный интервал времени; ReceiveCompleted Событие не вызывается. Другие перегрузки BeginReceive , зависящие от этого компонента, вызывают ReceiveCompleted событие.

ReceiveCompleted также вызывается, если сообщение уже существует в очереди.

Чтобы использовать BeginReceive, создайте обработчик событий, который обрабатывает результаты асинхронной операции и связывает его с делегатом события. BeginReceive инициирует асинхронную операцию получения; MessageQueue уведомление по ReceiveCompleted вызову события при поступлении сообщения в очередь. Затем MessageQueue он может получить доступ к сообщению, вызвав EndReceive(IAsyncResult) или получите результат с помощью .ReceiveCompletedEventArgs

Метод BeginReceive возвращается немедленно, но асинхронная операция не завершается до вызова обработчика событий.

Так как BeginReceive это асинхронно, его можно вызвать для получения сообщения из очереди, не блокируя текущий поток выполнения. Чтобы синхронно получить сообщение, используйте Receive метод.

После завершения асинхронной операции можно вызвать BeginPeek или BeginReceive еще раз в обработчике событий, чтобы сохранить получение уведомлений.

BeginReceive Возвращает IAsyncResult асинхронную операцию, запущенную методом. Это можно использовать IAsyncResult на протяжении всего времени существования операции, хотя обычно его не следует использовать до EndReceive(IAsyncResult) вызова. Однако при запуске нескольких асинхронных операций можно поместить их IAsyncResult значения в массив и указать, следует ли ожидать завершения всех операций или любой операции. В этом случае используйте AsyncWaitHandle свойство для IAsyncResult идентификации завершенной операции.

Объект состояния связывает сведения о состоянии с операцией. Например, при вызове BeginReceive нескольких раз для запуска нескольких операций можно определить каждую операцию с помощью определенного объекта состояния.

Можно также использовать объект состояния для передачи информации в потоках обработки. Если поток запущен, но обратный вызов находится в другом потоке в асинхронном сценарии, объект состояния маршалируется и передается обратно вместе с информацией из события.

Не используйте асинхронный вызов BeginReceive с транзакциями. Если вы хотите выполнить асинхронную операцию транзакций, вызвать BeginPeekи поместить транзакцию и метод (синхронный) Receive в обработчик событий, который вы создаете для операции просмотра. Обработчик событий может содержать функциональные возможности, как показано в следующем коде C#.

myMessageQueue.BeginTransaction();
 myMessageQueue.Receive();
 myMessageQueue.CommitTransaction();

В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.

Режим рабочей группы В наличии
Локальный компьютер Да
Имя локального компьютера и прямого формата Да
Удаленный компьютер Нет
Имя удаленного компьютера и прямого формата Да

См. также раздел

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

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

Метод не является потокобезопасной.