次の方法で共有


MessageQueue.BeginPeek メソッド (TimeSpan)

指定したタイムアウトのある非同期のピーク操作を実行します。この操作は、メッセージをキューで使用できるようになる、タイムアウトが発生するまで完了しません。

Overloads Public Function BeginPeek( _
   ByVal timeout As TimeSpan _) As IAsyncResult
[C#]
public IAsyncResult BeginPeek(TimeSpantimeout);
[C++]
public: IAsyncResult* BeginPeek(TimeSpantimeout);
[JScript]
public function BeginPeek(
   timeout : TimeSpan) : IAsyncResult;

パラメータ

  • timeout
    メッセージを使用できるようになるまでの待機時間を示す TimeSpan

戻り値

ポストされた非同期要求を識別する IAsyncResult

例外

例外の種類 条件
ArgumentException timeout パラメータに指定された値が無効です。
MessageQueueException メッセージ キューの API にアクセスしたときにエラーが発生しました。

解説

非同期処理では、メッセージがキューで使用できるようになったとき、または指定した時間が経過したときに、 BeginPeek を使用して PeekCompleted イベントを発生させます。

メモ   メッセージが既にキューに存在する場合は、 PeekCompleted も発生します。

BeginPeek を使用するには、非同期操作の結果を処理するイベント ハンドラを作成し、そのイベント ハンドラをイベント デリゲートに関連付けます。 BeginPeek が非同期ピーク操作を開始し、 PeekCompleted イベントの発生によって、メッセージがキューに到達したことが MessageQueue に通知されます。これで、 MessageQueue は、 EndPeek を呼び出すか、 PeekCompletedEventArgs を使用して結果を取得することによって、メッセージにアクセスできます。

メモ    BeginPeek メソッドからすぐに制御が戻りますが、非同期操作はイベント ハンドラが呼び出されるまで完了しません。

BeginPeek は非同期であるため、これを呼び出すことによって、現在の実行スレッドをブロックせずにキューをピークできます。キューを同期的にピークするには、 Peek メソッドを使用します。

非同期操作が完了した後で、 BeginPeek または BeginReceive をイベント ハンドラでもう一度呼び出すと、通知の受信を継続できます。

BeginPeek が返す IAsyncResult は、メソッドが開始した非同期操作を識別します。操作の有効期間を通じて、この IAsyncResult を使用できます。ただし、通常これは EndPeek が呼び出されるまでは使用しません。しかし、複数の非同期操作を開始する場合は、それらの IAsyncResult 値を 1 つの配列内に配置して、すべての操作の完了を待つか、どれか 1 つの操作の完了を待つかを指定できます。この場合は、 IAsyncResultAsyncWaitHandle プロパティを使用して、完了した操作を識別します。

このオーバーロードでタイムアウトを指定します。 timeout パラメータで指定した間隔が経過すると、このコンポーネントは PeekCompleted イベントを発生させ、操作に関連付けられた IAsyncResultIsCompleted プロパティが true になります。メッセージが存在しないため、後続の EndPeek 呼び出しでは例外がスローされます。

CanReadfalse の場合、完了イベントは発生しますが、 EndPeek を呼び出したときに例外がスローされます。

このメソッドが各種のワークグループ モードで使用できるかどうかを次の表に示します。

ワークグループ モード 使用可否
ローカル コンピュータ はい
ローカル コンピュータ + 直接書式名 はい
リモート コンピュータ いいえ
リモート コンピュータ + 直接書式名 はい

使用例

[Visual Basic, C#, C++] キューのパス ".\myQueue" を使用して非同期のピーク操作を作成する例を次に示します。イベントハンドラ MyPeekCompleted を作成し、 PeekCompleted イベント ハンドラ デリゲートに結び付けます。 BeginPeek は 1 分間のタイムアウトで呼び出され、非同期のピーク操作を実行します。 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 with a time-out 
            ' of one minute.
            myQueue.BeginPeek(New TimeSpan(0, 1, 0))

            ' 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.
                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 '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 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; 
        }
    }
}

[C++] 
#using <mscorlib.dll>
#using <system.dll>
#using <system.messaging.dll>

using namespace System;
using namespace System::Messaging;

__gc 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(S"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 = 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));

    // 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