MessageQueue.BeginPeek メソッド ()
タイムアウトのない非同期のピーク操作を実行します。操作は、キューのメッセージが利用可能になるまで完了しません。
Overloads Public Function BeginPeek() As IAsyncResult
[C#]
public IAsyncResult BeginPeek();
[C++]
public: IAsyncResult* BeginPeek();
[JScript]
public function BeginPeek() : IAsyncResult;
戻り値
ポストされた非同期要求を識別する IAsyncResult 。
例外
例外の種類 | 条件 |
---|---|
MessageQueueException | メッセージ キューの API にアクセスしたときにエラーが発生しました。 |
解説
非同期処理では、 BeginPeek を使用して、キューのメッセージが利用可能になったときに PeekCompleted イベントを発生させます。
メモ メッセージが既にキューに存在する場合は、 PeekCompleted も発生します。
BeginPeek を使用するには、非同期操作の結果を処理するイベント ハンドラを作成し、そのイベント ハンドラをイベント デリゲートに関連付けます。 BeginPeek が非同期ピーク操作を開始し、 PeekCompleted イベントの発生によって、メッセージがキューに到達したことが MessageQueue に通知されます。これで、 MessageQueue は、 EndPeek を呼び出すか、 PeekCompletedEventArgs を使用して結果を取得することによって、メッセージにアクセスできます。
メモ BeginPeek メソッドからすぐに制御が戻りますが、非同期操作はイベント ハンドラが呼び出されるまで完了しません。
BeginPeek は非同期であるため、これを呼び出すことによって、現在の実行スレッドをブロックせずにキューをピークできます。キューを同期的にピークするには、 Peek メソッドを使用します。
非同期操作が完了した後で、 BeginPeek または BeginReceive をイベント ハンドラでもう一度呼び出すと、通知の受信を継続できます。
BeginPeek が返す IAsyncResult は、メソッドが開始した非同期操作を識別します。操作の有効期間を通じて、この IAsyncResult を使用できます。ただし、通常これは EndPeek が呼び出されるまでは使用しません。しかし、複数の非同期操作を開始する場合は、それらの IAsyncResult 値を 1 つの配列内に配置して、すべての操作の完了を待つか、どれか 1 つの操作の完了を待つかを指定できます。この場合は、 IAsyncResult の AsyncWaitHandle プロパティを使用して、完了した操作を識別します。
CanRead が false の場合、完了イベントは発生しますが、 EndPeek を呼び出したときに例外がスローされます。
このメソッドが各種のワークグループ モードで使用できるかどうかを次の表に示します。
ワークグループ モード | 使用可否 |
---|---|
ローカル コンピュータ | はい |
ローカル コンピュータ + 直接書式名 | はい |
リモート コンピュータ | いいえ |
リモート コンピュータ + 直接書式名 | はい |
使用例
[Visual Basic, C#, C++] イベント ハンドラ MyPeekCompleted
を作成し、 PeekCompleted イベント ハンドラ デリゲートに結び付け、 BeginPeek を呼び出して非同期のピーク操作を実行する例を次に示します。ピーク操作の対象になるキューは ".\myQueue" パスにあります。 PeekCompleted イベントが発生すると、この例はメッセージをピークし、本文を画面に書き込みます。次に、 BeginPeek をもう一度呼び出して、新しい非同期のピーク操作を実行します。
Imports System
Imports 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 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 'Main
'**************************************************
' 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 '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
{
//**************************************************
// 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;
}
}
}
[C++]
#using <mscorlib.dll>
#using <system.dll>
#using <system.messaging.dll>
using namespace System;
using namespace System::Messaging;
// This example performs asynchronous peek operation
// processing.
//*************************************************
__gc class MyNewQueue
{
// Provides an event handler for the PeekCompleted
// event.
public:
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(S"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 = 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.
myQueue->BeginPeek();
// 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