Поделиться через


MessageQueue.BeginReceive Метод

Определение

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

Перегрузки

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

Комментарии

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

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

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

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

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

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

Возвращающий IAsyncResultBeginReceive объект определяет асинхронную операцию, запущенную методом. Его 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), передавая значение времени ожидания, равное 10 секундам. 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)вызывается исключение .

Возвращающий IAsyncResultBeginReceive объект определяет асинхронную операцию, запущенную методом. Его 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 снова в обработчике событий, чтобы продолжать получать уведомления.

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

Эта перегрузка задает время ожидания и объект состояния. Если истекает интервал, указанный параметром 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);
    }
}

Комментарии

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

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

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

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

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

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

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

Объект состояния связывает сведения о состоянии с операцией. Например, если вы вызываете 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, недопустимо.

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

Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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