MessageQueue.EndReceive(IAsyncResult) MessageQueue.EndReceive(IAsyncResult) MessageQueue.EndReceive(IAsyncResult) MessageQueue.EndReceive(IAsyncResult) Method

Определение

Завершает указанную асинхронную операцию получения.Completes the specified asynchronous receive operation.

public:
 System::Messaging::Message ^ EndReceive(IAsyncResult ^ asyncResult);
public System.Messaging.Message EndReceive (IAsyncResult asyncResult);
member this.EndReceive : IAsyncResult -> System.Messaging.Message
Public Function EndReceive (asyncResult As IAsyncResult) As Message

Параметры

asyncResult
IAsyncResult IAsyncResult IAsyncResult IAsyncResult

Объект IAsyncResult, определяющий асинхронную операцию получения, которая завершается и из которой извлекается конечный результат.The IAsyncResult that identifies the asynchronous receive operation to finish and from which to retrieve an end result.

Возвраты

Класс Message, связанный с завершенной асинхронной операцией.The Message associated with the completed asynchronous operation.

Исключения

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

Для параметра asyncResult используется неправильный синтаксис.The syntax of the asyncResult parameter is not valid.

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

Примеры

В следующем примере кода демонстрируется последовательное выполнение асинхронных запросов.The following code example chains asynchronous requests. Предполагается, что на локальном компьютере имеется очередь с именем «myQueue».It assumes there is a queue on the local computer called "myQueue". Функция начинает асинхронную операцию, которая обрабатывается MyReceiveCompleted подпрограммы. MainThe Main function begins the asynchronous operation that is handled by the MyReceiveCompleted routine. MyReceiveCompletedобрабатывает текущее сообщение и начинает новую асинхронную операцию получения.MyReceiveCompleted processes the current message and begins a new asynchronous receive operation.

#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 'Main



        ' 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 'MyReceiveCompleted

End Class 'MyNewQueue

Комментарии

При возникновении ReceiveCompleted события BeginReceive завершает операцию, инициированную EndReceive(IAsyncResult) вызовом.When the ReceiveCompleted event is raised, EndReceive(IAsyncResult) completes the operation that was initiated by the BeginReceive call. Для этого EndReceive(IAsyncResult) получает сообщение.To do so, EndReceive(IAsyncResult) receives the message.

BeginReceiveможет указывать время ожидания, которое вызывает ReceiveCompleted событие, если время ожидания возникает до появления сообщения в очереди.BeginReceive can specify a time-out, which causes the ReceiveCompleted event to be raised if the time-out occurs before a message appears in the queue. Если время ожидания происходит без сообщения, поступающего в очередь, последующий вызов EndReceive(IAsyncResult) вызывает исключение.When a time-out occurs without a message arriving in the queue, a subsequent call to EndReceive(IAsyncResult) throws an exception.

EndReceive(IAsyncResult)используется для чтения (удаления из очереди) сообщения, которое вызвало ReceiveCompleted возникновение события.EndReceive(IAsyncResult) is used to read (removing from the queue) the message that caused the ReceiveCompleted event to be raised.

Если вы хотите продолжить асинхронное получение сообщений, можно снова вызвать метод BeginReceive после вызова. EndReceive(IAsyncResult)If you want to continue to asynchronously receive messages, you can again call BeginReceive after calling EndReceive(IAsyncResult).

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

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

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

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