MessageQueue.BeginPeek メソッド (TimeSpan, Object)
指定したタイムアウトと指定した状態オブジェクトを持つ非同期のピーク操作を実行します。状態オブジェクトは、操作の有効期間を通じて関連付けられた情報を提供します。この操作は、メッセージをキューで使用できるようになる、タイムアウトが発生するまで完了しません。
Overloads Public Function BeginPeek( _
ByVal timeout As TimeSpan, _ ByVal stateObject As Object _) As IAsyncResult
[C#]
public IAsyncResult BeginPeek(TimeSpantimeout,objectstateObject);
[C++]
public: IAsyncResult* BeginPeek(TimeSpantimeout,Object* stateObject);
[JScript]
public function BeginPeek(
timeout : TimeSpan,stateObject : Object) : IAsyncResult;
パラメータ
- timeout
メッセージを使用できるようになるまでの待機時間を示す TimeSpan 。 - stateObject
非同期操作に関連付けられている情報を保持する状態オブジェクト。アプリケーションで指定します。
戻り値
ポストされた非同期要求を識別する IAsyncResult 。
例外
例外の種類 | 条件 |
---|---|
ArgumentException | timeout パラメータに指定された値が無効です。 |
MessageQueueException | メッセージ キューの API にアクセスしたときにエラーが発生しました。 |
解説
非同期処理では、メッセージがキューで使用できるようになったとき、または指定した時間が経過したときに、 BeginPeek を使用して PeekCompleted イベントを発生させます。
メモ メッセージが既にキューに存在する場合は、 PeekCompleted も発生します。
このオーバーロードを使用して、情報を操作と関連付けます。これは、操作の有効期間を通じて保存されます。イベント ハンドラは、操作に関連付けられた IAsyncResult の AsyncState プロパティを調べることで、この情報にアクセスできます。
BeginPeek を使用するには、非同期操作の結果を処理するイベント ハンドラを作成し、そのイベント ハンドラをイベント デリゲートに関連付けます。 BeginPeek が非同期ピーク操作を開始し、 PeekCompleted イベントの発生によって、メッセージがキューに到達したことが MessageQueue に通知されます。これで、 MessageQueue は、 EndPeek を呼び出すか、 PeekCompletedEventArgs を使用して結果を取得することによって、メッセージにアクセスできます。
メモ BeginPeek メソッドからすぐに制御が戻りますが、非同期操作はイベント ハンドラが呼び出されるまで完了しません。
BeginPeek は非同期であるため、これを呼び出すことによって、現在の実行スレッドをブロックせずにキューをピークできます。キューを同期的にピークするには、 Peek メソッドを使用します。
非同期操作が完了した後で、 BeginPeek または BeginReceive をイベント ハンドラでもう一度呼び出すと、通知の受信を継続できます。
BeginPeek は、メソッドが開始した非同期操作を識別する IAsyncResult を返します。操作の有効期間を通じて、この IAsyncResult を使用できます。ただし、通常これは EndPeek が呼び出されるまでは使用しません。しかし、複数の非同期操作を開始する場合は、それらの IAsyncResult 値を 1 つの配列内に配置して、すべての操作の完了を待つか、どれか 1 つの操作の完了を待つかを指定できます。この場合は、 IAsyncResult の AsyncWaitHandle プロパティを使用して、完了した操作を識別します。
このオーバーロードでタイムアウトと状態オブジェクトを指定します。 timeout パラメータで指定した間隔が経過すると、このコンポーネントは PeekCompleted イベントを発生させ、操作に関連付けられた IAsyncResult の IsCompleted プロパティが true になります。メッセージが存在しないため、後続の EndPeek 呼び出しでは例外がスローされます。
状態オブジェクトは、状態情報を操作に関連付けます。たとえば、 BeginPeek を複数回呼び出して複数の操作を開始した場合、定義した個別の状態オブジェクトによって各操作を識別できます。この事例については、「例」を参照してください。
状態オブジェクトを使用して、プロセス スレッド間で情報を渡すこともできます。スレッドが開始され、コールバックが別のスレッドで非同期に発生する場合は、状態オブジェクトがマーシャリングされてイベントの情報と共に返されます。
CanRead が false の場合、完了イベントは発生しますが、 EndPeek を呼び出したときに例外がスローされます。
このメソッドが各種のワークグループ モードで使用できるかどうかを次の表に示します。
ワークグループ モード | 使用可否 |
---|---|
ローカル コンピュータ | はい |
ローカル コンピュータ + 直接書式名 | はい |
リモート コンピュータ | いいえ |
リモート コンピュータ + 直接書式名 | はい |
使用例
[Visual Basic, C#, C++] キューのパス ".\myQueue" を使用して非同期のピーク操作を作成する例を次に示します。イベントハンドラ MyPeekCompleted
を作成し、 PeekCompleted イベント ハンドラ デリゲートに結び付けます。 BeginPeek は 1 分間のタイムアウトで呼び出されます。 BeginPeek の各呼び出しに、特定の操作を識別する一意に関連付けられた整数が割り当てられます。 PeekCompleted イベントが発生するか、またはタイムアウトの時間が経過すると、メッセージがある場合はそれが取得され、本文と操作固有の整数型の ID が画面に書き込まれます。次に、 BeginPeek がもう一度呼び出され、同じタイムアウトと完了した操作に関連付けられていた整数で新しい非同期のピーク操作が実行されます。
Imports System
Imports System.Messaging
Namespace MyProject
'/ <summary>
'/ Provides a container class for the example.
'/ </summary>
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 'Main
'**************************************************
' 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 'MyPeekCompleted
End Class 'MyNewQueue
End Namespace 'MyProject
[C#]
using System;
using System.Messaging;
namespace MyProject
{
/// <summary>
/// Provides a container class for the example.
/// </summary>
public class MyNewQueue
{
// 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;
}
}
}
[C++]
#using <mscorlib.dll>
#using <system.dll>
#using <system.messaging.dll>
using namespace System;
using namespace System::Messaging;
__gc 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(S"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), __box(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 = new MessageQueue(S".\\myQueue");
Type* p __gc[] = new Type* __gc[1];
p[0] = __typeof(String);
myQueue->Formatter = new XmlMessageFormatter( p );
// Add an event handler for the PeekCompleted event.
myQueue->PeekCompleted += new PeekCompletedEventHandler(0, MyNewQueue::MyPeekCompleted);
// Begin the asynchronous peek operation with a timeout
// of one minute.
myQueue->BeginPeek(TimeSpan(0, 1, 0), __box(MyNewQueue::messageNumber++));
// Do other work on the current thread.
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.BeginPeek オーバーロードの一覧 | EndPeek | PeekCompleted | BeginReceive | Peek | Receive | TimeSpan