MessageQueue.Peek メソッド ()
この MessageQueue が参照するキューにある最初のメッセージを、削除せずに返します (ピークします)。 Peek メソッドは同期メソッドであるため、メッセージが利用可能になるまで、現在のスレッドをブロックします。
Overloads Public Function Peek() As Message
[C#]
public Message Peek();
[C++]
public: Message* Peek();
[JScript]
public function Peek() : Message;
戻り値
キューの最初のメッセージを表す Message 。
例外
例外の種類 | 条件 |
---|---|
MessageQueueException | メッセージ キューの API にアクセスしたときにエラーが発生しました。 |
解説
このオーバーロードを使用して、キューをピークしたり、キューにメッセージが到達するまで待機したりします。
Peek メソッドは、最初のメッセージをキューから読み取りますが、削除はしません。そのため、 Peek を繰り返し呼び出すと、より優先順位の高いメッセージがそのキューに到達するまで、同じメッセージが返されます。一方、 Receive メソッドは、最初のメッセージをキューから読み取り、削除します。そのため、 Receive を繰り返し呼び出すと、異なるメッセージが返されます。
メモ メッセージ キューは、優先順位と到達時刻に従って、メッセージをキューの中で並べ替えます。新しいメッセージは、優先順位が高い場合にだけ、古いメッセージの前に置かれます。
キューにメッセージが到達するまで待機する間、現在のスレッドがブロックされてもいい場合は、 Peek を使用します。このオーバーロードはタイムアウトを指定しないため、アプリケーションが無限に待機する可能性があります。待機せずにアプリケーションの処理を継続する必要がある場合は、非同期の BeginPeek メソッドを使用します。タイムアウトを指定する Peek のオーバーロードを使用して、メッセージがキューに到達するまでのタイムアウトを指定することもできます。
このメソッドが各種のワークグループ モードで使用できるかどうかを次の表に示します。
ワークグループ モード | 使用可否 |
---|---|
ローカル コンピュータ | はい |
ローカル コンピュータ + 直接書式名 | はい |
リモート コンピュータ | いいえ |
リモート コンピュータ + 直接書式名 | はい |
使用例
[Visual Basic, C#, C++] キューに対して Peek メソッドを使用する例を次に示します。
[Visual Basic, C#, C++] 最初の例では、キューのメッセージが利用可能になるまでアプリケーションが待機します。最初の例は、メッセージが到達するまで処理を一時停止するだけで、到達したメッセージにアクセスしないことに注意してください。メッセージが既にキューに存在する場合は、すぐに戻ります。
[Visual Basic, C#, C++] 2 番目の例では、アプリケーション定義の Order
クラスが含まれたメッセージをキューに送信し、キューからピークします。
Imports System
Imports System.Messaging
Namespace MyProject
' This class represents an object the following example
' sends to a queue and peeks from a queue.
Public Class Order
Public orderId As Integer
Public orderTime As DateTime
End Class 'Order
'/ <summary>
'/ Provides a container class for the example.
'/ </summary>
Public Class MyNewQueue
'**************************************************
' Provides an entry point into the application.
'
' This example posts a notification that a message
' has arrived in a queue. It sends a message
' containing an other to a separate queue, and then
' peeks the first message in the queue.
'**************************************************
Public Shared Sub Main()
' Create a new instance of the class.
Dim myNewQueue As New MyNewQueue()
' Wait for a message to arrive in the queue.
myNewQueue.NotifyArrived()
' Send a message to a queue.
myNewQueue.SendMessage()
' Peek the first message in the queue.
myNewQueue.PeekFirstMessage()
Return
End Sub 'Main
'**************************************************
' Posts a notification when a message arrives in
' the queue "monitoredQueue". Does not retrieve any
' message information when peeking the message.
'**************************************************
Public Sub NotifyArrived()
' Connect to a queue.
Dim myQueue As New MessageQueue(".\monitoredQueue")
' Specify to retrieve no message information.
myQueue.MessageReadPropertyFilter.ClearAll()
' Wait for a message to arrive.
Dim emptyMessage As Message = myQueue.Peek()
' Post a notification when a message arrives.
Console.WriteLine("A message has arrived in the queue.")
Return
End Sub 'NotifyArrived
'**************************************************
' Sends an Order to a queue.
'**************************************************
Public Sub SendMessage()
' Create a new order and set values.
Dim sentOrder As New Order()
sentOrder.orderId = 3
sentOrder.orderTime = DateTime.Now
' Connect to a queue on the local computer.
Dim myQueue As New MessageQueue(".\myQueue")
' Send the Order to the queue.
myQueue.Send(sentOrder)
Return
End Sub 'SendMessage
'**************************************************
' Peeks a message containing an Order.
'**************************************************
Public Sub PeekFirstMessage()
' Connect to a queue.
Dim myQueue As New MessageQueue(".\myQueue")
' Set the formatter to indicate body contains an Order.
myQueue.Formatter = New XmlMessageFormatter(New Type() _
{GetType(MyProject.Order)})
Try
' Peek and format the message.
Dim myMessage As Message = myQueue.Peek()
Dim myOrder As Order = CType(myMessage.Body, Order)
' Display message information.
Console.WriteLine(("Order ID: " + _
myOrder.orderId.ToString()))
Console.WriteLine(("Sent: " + _
myOrder.orderTime.ToString()))
Catch m as MessageQueueException
' Handle Message Queuing exceptions.
Catch e As InvalidOperationException
' Handle invalid serialization format.
Console.WriteLine(e.Message)
' Catch other exceptions as necessary.
End Try
Return
End Sub 'PeekFirstMessage
End Class 'MyNewQueue
End Namespace 'MyProject
[C#]
using System;
using System.Messaging;
namespace MyProject
{
// This class represents an object the following example
// sends to a queue and receives from a queue.
public class Order
{
public int orderId;
public DateTime orderTime;
};
/// <summary>
/// Provides a container class for the example.
/// </summary>
public class MyNewQueue
{
//**************************************************
// Provides an entry point into the application.
//
// This example posts a notification that a message
// has arrived in a queue. It sends a message
// containing an other to a separate queue, and then
// peeks the first message in the queue.
//**************************************************
public static void Main()
{
// Create a new instance of the class.
MyNewQueue myNewQueue = new MyNewQueue();
// Wait for a message to arrive in the queue.
myNewQueue.NotifyArrived();
// Send a message to a queue.
myNewQueue.SendMessage();
// Peek the first message in the queue.
myNewQueue.PeekFirstMessage();
return;
}
//**************************************************
// Posts a notification when a message arrives in
// the queue "monitoredQueue". Does not retrieve any
// message information when peeking the message.
//**************************************************
public void NotifyArrived()
{
// Connect to a queue.
MessageQueue myQueue = new
MessageQueue(".\\monitoredQueue");
// Specify to retrieve no message information.
myQueue.MessageReadPropertyFilter.ClearAll();
// Wait for a message to arrive.
Message emptyMessage = myQueue.Peek();
// Post a notification when a message arrives.
Console.WriteLine("A message has arrived in the queue.");
return;
}
//**************************************************
// Sends an Order to a queue.
//**************************************************
public void SendMessage()
{
// Create a new order and set values.
Order sentOrder = new Order();
sentOrder.orderId = 3;
sentOrder.orderTime = DateTime.Now;
// Connect to a queue on the local computer.
MessageQueue myQueue = new MessageQueue(".\\myQueue");
// Send the Order to the queue.
myQueue.Send(sentOrder);
return;
}
//**************************************************
// Peeks a message containing an Order.
//**************************************************
public void PeekFirstMessage()
{
// Connect to a queue.
MessageQueue myQueue = new MessageQueue(".\\myQueue");
// Set the formatter to indicate the body contains an Order.
myQueue.Formatter = new XmlMessageFormatter(new Type[]
{typeof(MyProject.Order)});
try
{
// Peek and format the message.
Message myMessage = myQueue.Peek();
Order myOrder = (Order)myMessage.Body;
// Display message information.
Console.WriteLine("Order ID: " +
myOrder.orderId.ToString());
Console.WriteLine("Sent: " +
myOrder.orderTime.ToString());
}
catch (MessageQueueException)
{
// Handle Message Queuing exceptions.
}
// Handle invalid serialization format.
catch (InvalidOperationException e)
{
Console.WriteLine(e.Message);
}
// Catch other exceptions as necessary.
return;
}
}
}
[C++]
#using <mscorlib.dll>
#using <system.dll>
#using <system.messaging.dll>
using namespace System;
using namespace System::Messaging;
// This class represents an object the following example
// sends to a queue and receives from a queue.
__gc class Order
{
public:
int orderId;
DateTime orderTime;
};
/// <summary>
/// Provides a container class for the example.
/// </summary>
__gc class MyNewQueue
{
public:
//*************************************************
// Posts a notification when a message arrives in
// the queue S"monitoredQueue". Does not retrieve any
// message information when peeking the message.
//*************************************************
void NotifyArrived()
{
// Connect to a queue.
MessageQueue* myQueue = new MessageQueue(S".\\monitoredQueue");
// Specify to retrieve no message information.
myQueue->MessageReadPropertyFilter->ClearAll();
// Wait for a message to arrive.
Message* emptyMessage = myQueue->Peek();
// Post a notification when a message arrives.
Console::WriteLine(S"A message has arrived in the queue.");
return;
}
//*************************************************
// Sends an Order to a queue.
//*************************************************
void SendMessage()
{
// Create a new order and set values.
Order* sentOrder = new Order();
sentOrder->orderId = 3;
sentOrder->orderTime = DateTime::Now;
// Connect to a queue on the local computer.
MessageQueue* myQueue = new MessageQueue(S".\\myQueue");
// Send the Order to the queue.
myQueue->Send(sentOrder);
return;
}
//*************************************************
// Peeks a message containing an Order.
//*************************************************
void PeekFirstMessage()
{
// Connect to a queue.
MessageQueue* myQueue = new MessageQueue(S".\\myQueue");
// Set the formatter to indicate the body contains an Order.
Type *p __gc[] = new Type* __gc[1];
p[0] = __typeof(Order);
myQueue->Formatter = new XmlMessageFormatter( p );
try
{
// Peek and format the message.
Message* myMessage = myQueue->Peek();
Order* myOrder = static_cast<Order*>(myMessage->Body);
// Display message information.
Console::WriteLine(S"Order ID: {0}", __box(myOrder->orderId));
Console::WriteLine(S"Sent: {0}", __box(myOrder->orderTime));
}
catch (MessageQueueException*)
{
// Handle Message Queuing exceptions.
}
// Handle invalid serialization format.
catch (InvalidOperationException* e)
{
Console::WriteLine(e->Message);
}
// Catch other exceptions as necessary.
return;
}
};
//*************************************************
// Provides an entry point into the application.
//
// This example posts a notification that a message
// has arrived in a queue. It sends a message
// containing an other to a separate queue, and then
// peeks the first message in the queue.
//*************************************************
int main()
{
// Create a new instance of the class.
MyNewQueue* myNewQueue = new MyNewQueue();
// Wait for a message to arrive in the queue.
myNewQueue->NotifyArrived();
// Send a message to a queue.
myNewQueue->SendMessage();
// Peek the first message in the queue.
myNewQueue->PeekFirstMessage();
return 0;
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
.NET Framework セキュリティ:
- 直前の呼び出し元の完全信頼。このメンバは、部分的に信頼されているコードから使用することはできません。詳細の参照先 : 部分信頼コードからのライブラリの使用
参照
MessageQueue クラス | MessageQueue メンバ | System.Messaging 名前空間 | MessageQueue.Peek オーバーロードの一覧 | PeekById | PeekByCorrelationId | Receive | BeginPeek