MessageQueue.BeginPeek Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Инициирует асинхронную операцию просмотра, сказав очередь сообщений, чтобы начать просмотр сообщения и уведомить обработчик событий по завершении.
Перегрузки
| Имя | Описание |
|---|---|
| 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
Параметры
- 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));
}
}
Комментарии
При использовании этой перегрузки обратный вызов, указанный в параметре обратного вызова, вызывается непосредственно, когда сообщение становится доступным в очереди или когда истек указанный интервал времени; 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
Параметры
- 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
Параметры
- action
- PeekAction
Одно из значений PeekAction . Указывает, следует ли просмотреть текущее сообщение в очереди или следующее сообщение.
- state
- Object
Объект состояния, указанный приложением, содержащий сведения, связанные с асинхронной операцией.
- callback
- AsyncCallback
Получает AsyncCallback уведомление о завершении асинхронной операции.
Возвращаемое значение
Объект IAsyncResult , определяющий опубликованный асинхронный запрос.
Исключения
Значение, отличное PeekAction.Current от или PeekAction.Next указанного action для параметра.
Параметр cursor имеет значение null.
Для параметра timeout указано недопустимое значение.
Произошла ошибка при доступе к методу очереди сообщений.
Комментарии
При использовании этой перегрузки обратный вызов, указанный в параметре обратного вызова, вызывается непосредственно, когда сообщение становится доступным в очереди или когда истек указанный интервал времени. Событие 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 еще раз в обработчике событий, чтобы сохранить получение уведомлений.
BeginPeek Возвращает IAsyncResult асинхронную операцию, запущенную методом. Это можно использовать IAsyncResult на протяжении всего времени существования операции, хотя обычно его не следует использовать до EndPeek(IAsyncResult) вызова. Однако при запуске нескольких асинхронных операций можно поместить их IAsyncResult значения в массив и указать, следует ли ожидать завершения всех операций или любой операции. В этом случае используется AsyncWaitHandle свойство для идентификации IAsyncResult завершенной операции.
Если 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
Параметры
Возвращаемое значение
Объект 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 еще раз в обработчике событий, чтобы сохранить получение уведомлений.
BeginPeek Возвращает IAsyncResult асинхронную операцию, запущенную методом. Это можно использовать IAsyncResult на протяжении всего времени существования операции, хотя обычно его не следует использовать до EndPeek(IAsyncResult) вызова. Однако при запуске нескольких асинхронных операций можно поместить их IAsyncResult значения в массив и указать, следует ли ожидать завершения всех операций или любой операции. В этом случае используется AsyncWaitHandle свойство для идентификации IAsyncResult завершенной операции.
Эта перегрузка задает время ожидания. Если истекает интервал, указанный параметром timeout , этот компонент вызывает PeekCompleted событие. Так как сообщение не существует, последующий вызов EndPeek(IAsyncResult) вызывает исключение.
Если CanRead это falseтак, вызывается событие завершения, но при вызове EndPeek(IAsyncResult)возникает исключение.
В следующей таблице показано, доступен ли этот метод в различных режимах рабочей группы.
| Режим рабочей группы | В наличии |
|---|---|
| Локальный компьютер | Да |
| Имя локального компьютера и прямого формата | Да |
| Удаленный компьютер | Нет |
| Имя удаленного компьютера и прямого формата | Да |
См. также раздел
Применяется к
Потокобезопасность
Метод не является потокобезопасной.