MessageQueue.BeginPeek Метод

Определение

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

Перегрузки

BeginPeek(TimeSpan, Object, AsyncCallback)

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

BeginPeek(TimeSpan, Object)

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

BeginPeek(TimeSpan, Cursor, PeekAction, Object, AsyncCallback)

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

BeginPeek()

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

BeginPeek(TimeSpan)

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

BeginPeek(TimeSpan, Object, AsyncCallback)

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

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

Параметры

timeout
TimeSpan

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

stateObject
Object

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

callback
AsyncCallback

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

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

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

Исключения

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

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

Примеры

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

#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 PeekCompleted event.
void MyPeekCompleted(IAsyncResult^ asyncResult)
{
    // Connect to the queue.
    MessageQueue^ queue = gcnew MessageQueue(".\\exampleQueue");

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

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

    // Receive the message. This will remove the message from the queue.
    msg = queue->Receive(TimeSpan::FromSeconds(10.0));

    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.
    CreateQueue(".\\exampleQueue", false);

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

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

    // Begin the asynchronous peek operation.
    queue->BeginPeek(TimeSpan::FromSeconds(10.0), messageNumber++,
        gcnew AsyncCallback(MyPeekCompleted));

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

    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 peek operation.
        queue.BeginPeek(TimeSpan.FromSeconds(10.0), messageNumber++,
            new AsyncCallback(MyPeekCompleted));

        // 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 PeekCompleted event.
    private static void MyPeekCompleted(IAsyncResult asyncResult)
    {
        // Connect to the queue.
        MessageQueue queue = new MessageQueue(".\\exampleQueue");

        // End the asynchronous peek operation.
        Message msg = queue.EndPeek(asyncResult);

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

        // Receive the message. This will remove the message from the queue.
        msg = queue.Receive(TimeSpan.FromSeconds(10.0));
    }
}

Комментарии

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

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

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

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

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

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

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

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

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

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

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

BeginPeek(TimeSpan, Object)

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

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

Параметры

timeout
TimeSpan

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

stateObject
Object

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

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

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

Исключения

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

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

Примеры

В следующем примере кода создается асинхронная операция просмотра с использованием пути очереди .\myQueue. Он создает обработчик MyPeekCompletedсобытий и присоединяет его к делегату обработчика PeekCompleted событий. BeginPeek вызывается с временем ожидания в одну минуту. Каждый вызов имеет BeginPeek уникальное связанное целое число, которое идентифицирует конкретную операцию. PeekCompleted При возникновении события или истечении времени ожидания извлекается сообщение, если оно существует, а его текст и идентификатор целочисленного значения для конкретной операции записываются на экран. Затем BeginPeek вызывается снова, чтобы инициировать новую асинхронную операцию просмотра с тем же тайм-аутом и связанным целым числом только что завершенной операции.

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

using namespace System;
using namespace System::Messaging;
ref class MyNewQueue
{
public:

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

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

         // End the asynchronous peek operation.
         Message^ m = mq->EndPeek( asyncResult->AsyncResult );

         // Display message information on the screen, 
         // including the message number (state object).
         Console::WriteLine( "Message: {0} {1}", asyncResult->AsyncResult->AsyncState, static_cast<String^>(m->Body) );

         // Restart the asynchronous peek operation, with the 
         // same time-out.
         mq->BeginPeek( TimeSpan(0,1,0), messageNumber++ );
      }
      catch ( MessageQueueException^ e ) 
      {
         if ( e->MessageQueueErrorCode == MessageQueueErrorCode::IOTimeout )
         {
            Console::WriteLine( e );
         }

         // Handle other sources of MessageQueueException.
      }

      // Handle other exceptions.
      return;
   }
};


// Provides an entry point into the application.
//         
// This example performs asynchronous peek 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 PeekCompleted event.
   myQueue->PeekCompleted += gcnew PeekCompletedEventHandler( MyNewQueue::MyPeekCompleted );

   // Begin the asynchronous peek operation with a timeout 
   // of one minute.
   myQueue->BeginPeek( TimeSpan(0,1,0), MyNewQueue::messageNumber++ );

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

namespace MyProject
{
    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue3
    {
        // Represents a state object associated with each message.
        static int messageNumber = 0;

        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example performs asynchronous peek 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 PeekCompleted event.
            myQueue.PeekCompleted += new
                PeekCompletedEventHandler(MyPeekCompleted);

            // Begin the asynchronous peek operation with a time-out
            // of one minute.
            myQueue.BeginPeek(new TimeSpan(0, 1, 0), messageNumber++);

            // Do other work on the current thread.

            return;
        }

        //**************************************************
        // Provides an event handler for the PeekCompleted
        // event.
        //**************************************************

        private static void MyPeekCompleted(Object source,
            PeekCompletedEventArgs asyncResult)
        {
            try
            {
                // Connect to the queue.
                MessageQueue mq = (MessageQueue)source;

                // End the asynchronous peek operation.
                Message m = mq.EndPeek(asyncResult.AsyncResult);

                // Display message information on the screen,
                // including the message number (state object).
                Console.WriteLine("Message: " +
                    (int)asyncResult.AsyncResult.AsyncState + " "
                    + (string)m.Body);

                // Restart the asynchronous peek operation, with the
                // same time-out.
                mq.BeginPeek(new TimeSpan(0, 1, 0), messageNumber++);
            }

            catch (MessageQueueException e)
            {
                if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.IOTimeout)
                {
                    Console.WriteLine(e.ToString());
                }

                // Handle other sources of MessageQueueException.
            }

            // Handle other exceptions.

            return;
        }
    }
}
Imports System.Messaging


   
' Provides a container class for the example.

Public Class MyNewQueue

        ' Represents a state object associated with each message.
        Private Shared messageNumber As Integer = 0



        ' Provides an entry point into the application.
        '		 
        ' This example performs asynchronous peek 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 PeekCompleted event.
            AddHandler myQueue.PeekCompleted, AddressOf _
                MyPeekCompleted

            ' Begin the asynchronous peek operation with a time-out 
            ' of one minute.
            myQueue.BeginPeek(New TimeSpan(0, 1, 0), messageNumber)
            messageNumber += 1

            ' Do other work on the current thread.
            Return
        End Sub



        ' Provides an event handler for the PeekCompleted
        ' event.


        Private Shared Sub MyPeekCompleted(ByVal [source] As _
            [Object], ByVal asyncResult As _
            PeekCompletedEventArgs)

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

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

                ' Display message information on the screen, 
                ' including(the) message number (state object).
                Console.WriteLine(("Message: " + _
                    CInt(asyncResult.AsyncResult.AsyncState) + _
                    " " + CStr(m.Body)))

                ' Restart the asynchronous peek operation, with the 
                ' same time-out.
                mq.BeginPeek(New TimeSpan(0, 1, 0), messageNumber)
                messageNumber += 1


            Catch e As MessageQueueException

                If e.MessageQueueErrorCode = _
                    MessageQueueErrorCode.IOTimeout Then

                    Console.WriteLine(e.ToString())

                    ' Handle other sources of MessageQueueException.

                End If

                ' Handle other exceptions.

            End Try

            Return

        End Sub

End Class

Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

BeginPeek(TimeSpan, Cursor, PeekAction, Object, AsyncCallback)

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

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

Параметры

timeout
TimeSpan

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

cursor
Cursor

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

action
PeekAction

Одно из значений перечисления PeekAction. Указывает, следует ли считывать текущее сообщение в очереди или следующее сообщение.

state
Object

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

callback
AsyncCallback

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

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

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

Исключения

Для параметра action было задано значение, отличное от PeekAction.Current или PeekAction.Next.

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

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

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

Комментарии

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

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

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

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

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

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

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

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

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

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

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

BeginPeek()

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

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

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

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

Исключения

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

Примеры

В следующем примере кода создается обработчик событий с именем MyPeekCompleted, он присоединяется к делегату PeekCompleted обработчика событий и вызывается BeginPeek для запуска асинхронной операции просмотра в очереди, расположенной по пути .\myQueue. PeekCompleted При возникновении события в примере отображается сообщение и записывается его текст на экран. Затем в примере снова вызывается BeginPeek для запуска новой асинхронной операции просмотра.

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

using namespace System;
using namespace System::Messaging;

// This example performs asynchronous peek operation
// processing.
//*************************************************
ref class MyNewQueue
{
public:

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

      // End the asynchronous peek operation.
      Message^ m = mq->EndPeek( asyncResult->AsyncResult );

      // Display message information on the screen.
      Console::WriteLine( "Message: {0}", static_cast<String^>(m->Body) );

      // Restart the asynchronous peek operation.
      mq->BeginPeek();
      return;
   }
};

// Provides an entry point into the application.
//         
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 PeekCompleted event.
   myQueue->PeekCompleted += gcnew PeekCompletedEventHandler( MyNewQueue::MyPeekCompleted );

   // Begin the asynchronous peek operation.
   myQueue->BeginPeek();

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

namespace MyProject
{
    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {
        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example performs asynchronous peek 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 PeekCompleted event.
            myQueue.PeekCompleted += new
                PeekCompletedEventHandler(MyPeekCompleted);

            // Begin the asynchronous peek operation.
            myQueue.BeginPeek();

            // Do other work on the current thread.

            return;
        }

        //**************************************************
        // Provides an event handler for the PeekCompleted
        // event.
        //**************************************************

        private static void MyPeekCompleted(Object source,
            PeekCompletedEventArgs asyncResult)
        {
            // Connect to the queue.
            MessageQueue mq = (MessageQueue)source;

            // End the asynchronous peek operation.
            Message m = mq.EndPeek(asyncResult.AsyncResult);

            // Display message information on the screen.
            Console.WriteLine("Message: " + (string)m.Body);

            // Restart the asynchronous peek operation.
            mq.BeginPeek();

            return;
        }
    }
}
Imports System.Messaging





' Provides a container class for the example.
Public Class MyNewQueue



        ' Provides an entry point into the application.
        '		 
        ' This example performs asynchronous peek 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 PeekCompleted event.
            AddHandler myQueue.PeekCompleted, AddressOf _
                MyPeekCompleted

            ' Begin the asynchronous peek operation.
            myQueue.BeginPeek()

            ' Do other work on the current thread.
            Return
        End Sub


        '**************************************************
        ' Provides an event handler for the PeekCompleted
        ' event.
        '**************************************************

        Private Shared Sub MyPeekCompleted(ByVal [source] As _
            [Object], ByVal asyncResult As PeekCompletedEventArgs)

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

            ' End the asynchronous peek operation.
            Dim m As Message = mq.EndPeek(asyncResult.AsyncResult)

            ' Display message information on the screen.
            Console.WriteLine(("Message: " + CStr(m.Body)))

            ' Restart the asynchronous peek operation.
            mq.BeginPeek()

            Return

        End Sub

End Class

Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

BeginPeek(TimeSpan)

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

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

Параметры

timeout
TimeSpan

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

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

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

Исключения

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

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

Примеры

В следующем примере кода создается асинхронная операция просмотра с использованием пути очереди .\myQueue. Он создает обработчик MyPeekCompletedсобытий и присоединяет его к делегату обработчика PeekCompleted событий. BeginPeek вызывается с временем ожидания в одну минуту, чтобы инициировать асинхронную операцию просмотра. PeekCompleted При возникновении события или истечении времени ожидания сообщение извлекается, если оно существует, и его текст записывается на экран. Затем BeginPeek вызывается еще раз, чтобы инициировать новую асинхронную операцию просмотра с тем же временем ожидания.

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

using namespace System;
using namespace System::Messaging;
ref class MyNewQueue
{
public:
   static void MyPeekCompleted( Object^ source, PeekCompletedEventArgs^ asyncResult )
   {      try
      {
         // Connect to the queue.
         MessageQueue^ mq = dynamic_cast<MessageQueue^>(source);

         // End the asynchronous peek operation.
         Message^ m = mq->EndPeek( asyncResult->AsyncResult );

         // Display message information on the screen.
         Console::WriteLine( "Message: {0}", static_cast<String^>(m->Body) );

         // Restart the asynchronous peek operation, with the 
         // same time-out.
         mq->BeginPeek( TimeSpan(0,1,0) );
      }
      catch ( MessageQueueException^ e ) 
      {
         if ( e->MessageQueueErrorCode == MessageQueueErrorCode::IOTimeout )
         {
            Console::WriteLine( e );
         }

         // Handle other sources of MessageQueueException.
      }

      // Handle other exceptions.
      return;
   }
};

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 PeekCompleted event.
   myQueue->PeekCompleted += gcnew PeekCompletedEventHandler( MyNewQueue::MyPeekCompleted );

   // Begin the asynchronous peek operation with a timeout 
   // of one minute.
   myQueue->BeginPeek( TimeSpan(0,1,0) );

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

namespace MyProject
{
    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue2
    {
        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example performs asynchronous peek 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 PeekCompleted event.
            myQueue.PeekCompleted += new
                PeekCompletedEventHandler(MyPeekCompleted);

            // Begin the asynchronous peek operation with a time-out
            // of one minute.
            myQueue.BeginPeek(new TimeSpan(0, 1, 0));

            // Do other work on the current thread.

            return;
        }

        //**************************************************
        // Provides an event handler for the PeekCompleted
        // event.
        //**************************************************

        private static void MyPeekCompleted(Object source,
            PeekCompletedEventArgs asyncResult)
        {
            try
            {
                // Connect to the queue.
                MessageQueue mq = (MessageQueue)source;

                // End the asynchronous peek operation.
                Message m = mq.EndPeek(asyncResult.AsyncResult);

                // Display message information on the screen.
                Console.WriteLine("Message: " + (string)m.Body);

                // Restart the asynchronous peek operation, with the
                // same time-out.
                mq.BeginPeek(new TimeSpan(0, 1, 0));
            }

            catch (MessageQueueException e)
            {
                if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.IOTimeout)
                {
                    Console.WriteLine(e.ToString());
                }

                // Handle other sources of MessageQueueException.
            }

            // Handle other exceptions.

            return;
        }
    }
}
Imports System.Messaging


' Provides a container class for the example.
Public Class MyNewQueue



        ' Provides an entry point into the application.
        '		 
        ' This example performs asynchronous peek 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 PeekCompleted event.
            AddHandler myQueue.PeekCompleted, _
                    AddressOf MyPeekCompleted

            ' Begin the asynchronous peek operation with a time-out 
            ' of one minute.
            myQueue.BeginPeek(New TimeSpan(0, 1, 0))

            ' Do other work on the current thread.
            Return

        End Sub



        ' Provides an event handler for the PeekCompleted
        ' event.


        Private Shared Sub MyPeekCompleted(ByVal [source] As _
            [Object], ByVal asyncResult As _
            PeekCompletedEventArgs)

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

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

                ' Display message information on the screen.
                Console.WriteLine(("Message: " + CStr(m.Body)))

                ' Restart the asynchronous peek operation, with the 
                ' same time-out.
                mq.BeginPeek(New TimeSpan(0, 1, 0))

            Catch e As MessageQueueException

                If e.MessageQueueErrorCode = _
                    MessageQueueErrorCode.IOTimeout Then

                    Console.WriteLine(e.ToString())

                    ' Handle other sources of MessageQueueException.
                End If

                ' Handle other exceptions.

            End Try

            Return

        End Sub

End Class

Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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