次の方法で共有


MessageQueue.BeginReceive メソッド ()

タイムアウトのない非同期の受信操作を実行します。操作は、キューのメッセージが利用可能になるまで完了しません。

Overloads Public Function BeginReceive() As IAsyncResult
[C#]
public IAsyncResult BeginReceive();
[C++]
public: IAsyncResult* BeginReceive();
[JScript]
public function BeginReceive() : IAsyncResult;

戻り値

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

例外

例外の種類 条件
MessageQueueException メッセージ キューの API にアクセスしたときにエラーが発生しました。

解説

非同期処理では、 BeginReceive を使用して、キューからメッセージが削除されたときに ReceiveCompleted イベントを発生させます。

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

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

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

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

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

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

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

メモ   トランザクションに対して BeginReceive を非同期に呼び出さないでください。トランザクションの非同期操作を実行するには、 BeginPeek を呼び出し、トランザクションと (同期) Receive メソッドを、ピーク操作用に作成したイベント ハンドラに配置します。イベント ハンドラに、次の C# コードに示す機能が含まれている可能性があります。

myMessageQueue.BeginTransaction();
 myMessageQueue.Receive();
 myMessageQueue.CommitTransaction();

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

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

使用例

[Visual Basic, C#, C++] 非同期要求をチェインする例を次に示します。ローカル コンピュータに "myQueue" というキューがあることを前提にしています。 Main 関数は、 MyReceiveCompleted ルーチンで処理される非同期操作を開始します。 MyReceiveCompleted は現在のメッセージを処理し、新しい非同期の受信操作を開始します。

 
Imports System
Imports System.Messaging
Imports System.Threading

Namespace MyProject

    '/ <summary>
    '/ Provides a container class for the example.
    '/ </summary>
    Public Class MyNewQueue

        ' Define static class members.
        Private Shared signal As New ManualResetEvent(False)
        Private Shared count As Integer = 0


        '**************************************************
        ' Provides an entry point into the application.
        '         
        ' This example performs asynchronous receive
        ' 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 ReceiveCompleted event.
            AddHandler myQueue.ReceiveCompleted, AddressOf _
                MyReceiveCompleted

            ' Begin the asynchronous receive operation.
            myQueue.BeginReceive()

            signal.WaitOne()

            ' Do other work on the current thread.

            Return

        End Sub 'Main


        '***************************************************
        ' Provides an event handler for the ReceiveCompleted
        ' event.
        '***************************************************

        Private Shared Sub MyReceiveCompleted(ByVal [source] As _
            [Object], ByVal asyncResult As ReceiveCompletedEventArgs)

            Try
                ' Connect to the queue.
                Dim mq As MessageQueue = CType([source], MessageQueue)

                ' End the asynchronous receive operation.
                Dim m As Message = _
                    mq.EndReceive(asyncResult.AsyncResult)

                count += 1
                If count = 10 Then
                    signal.Set()
                End If

                ' Restart the asynchronous receive operation.
                mq.BeginReceive()

            Catch
                ' Handle sources of MessageQueueException.

                ' Handle other exceptions.

            End Try

            Return

        End Sub 'MyReceiveCompleted

    End Class 'MyNewQueue
End Namespace 'MyProject

[C#] 
using System;
using System.Messaging;
using System.Threading;

namespace MyProject
{
    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {
        // Define static class members.
        static ManualResetEvent signal = new ManualResetEvent(false);
        static int count = 0;

        //**************************************************
        // Provides an entry point into the application.
        //         
        // This example performs asynchronous receive
        // 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 ReceiveCompleted event.
            myQueue.ReceiveCompleted += 
                new ReceiveCompletedEventHandler(MyReceiveCompleted);
            
            // Begin the asynchronous receive operation.
            myQueue.BeginReceive();

            signal.WaitOne();
            
            // Do other work on the current thread.

            return;
        }


        //***************************************************
        // Provides an event handler for the ReceiveCompleted
        // event.
        //***************************************************
        
        private static void MyReceiveCompleted(Object source, 
            ReceiveCompletedEventArgs asyncResult)
        {
            try
            {
                // Connect to the queue.
                MessageQueue mq = (MessageQueue)source;

                // End the asynchronous receive operation.
                Message m = mq.EndReceive(asyncResult.AsyncResult);
                
                count += 1;
                if (count == 10)
                {
                    signal.Set();
                }

                // Restart the asynchronous receive operation.
                mq.BeginReceive();
            }
            catch(MessageQueueException)
            {
                // Handle 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;
using namespace System::Threading;

__gc class MyNewQueue 
{
public:
    // Define static class members.
    static ManualResetEvent* signal = new ManualResetEvent(false);
    static int count = 0;

    // Provides an event handler for the ReceiveCompleted
    // event.

public:
    static void MyReceiveCompleted(Object* source, 
        ReceiveCompletedEventArgs* asyncResult) 
    {
        try 
        {
            // Connect to the queue.
            MessageQueue* mq = dynamic_cast<MessageQueue*>(source);

            // End the asynchronous receive operation.
            mq->EndReceive(asyncResult->AsyncResult);

            count += 1;
            if (count == 10) 
            {
                signal->Set();
            }

            // Restart the asynchronous receive operation.
            mq->BeginReceive();
        } 
        catch (MessageQueueException*) 
        {
            // Handle sources of MessageQueueException.
        }

        // Handle other exceptions.

        return; 
    }
};

// Provides an entry point into the application.
//         
// This example performs asynchronous receive
// 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 ReceiveCompleted event.
    myQueue->ReceiveCompleted += new ReceiveCompletedEventHandler(0, MyNewQueue::MyReceiveCompleted);

    // Begin the asynchronous receive operation.
    myQueue->BeginReceive();

    MyNewQueue::signal->WaitOne();

    // Do other work on the current thread.

    return 0;
}

[Visual Basic, C#, C++] 非同期要求をキューに入れる例を次に示します。 BeginReceive 呼び出しは、戻り値に AsyncWaitHandle を使用します。 Main ルーチンは、すべての非同期操作が完了するまで待機してから終了します。

 
Imports System
Imports System.Messaging
Imports System.Threading

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 receive
        ' 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 ReceiveCompleted event.
            AddHandler myQueue.ReceiveCompleted, AddressOf _
                MyReceiveCompleted

            ' Define wait handles for multiple operations.
            Dim waitHandleArray(10) As WaitHandle

            Dim i As Integer
            For i = 0 To 9
                ' Begin asynchronous operations.
                waitHandleArray(i) = _
                    myQueue.BeginReceive().AsyncWaitHandle
            Next i

            ' Specify to wait for all operations to return.
            WaitHandle.WaitAll(waitHandleArray)

            Return

        End Sub 'Main


        '***************************************************
        ' Provides an event handler for the ReceiveCompleted
        ' event.
        '***************************************************

        Private Shared Sub MyReceiveCompleted(ByVal [source] As _
            [Object], ByVal asyncResult As ReceiveCompletedEventArgs)

            Try
                ' Connect to the queue.
                Dim mq As MessageQueue = CType([source], MessageQueue)

                ' End the asynchronous receive operation.
                Dim m As Message = _
                    mq.EndReceive(asyncResult.AsyncResult)

                ' Process the message here.
                Console.WriteLine("Message received.")

            Catch

                ' Handle sources of MessageQueueException.

                ' Handle other exceptions.

            End Try

            Return

        End Sub 'MyReceiveCompleted

    End Class 'MyNewQueue
End Namespace 'MyProject

[C#] 
using System;
using System.Messaging;
using System.Threading;

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 receive
        // 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 ReceiveCompleted event.
            myQueue.ReceiveCompleted += 
                new ReceiveCompletedEventHandler(MyReceiveCompleted);
            
            // Define wait handles for multiple operations.
            WaitHandle[] waitHandleArray = new WaitHandle[10];
            for(int i=0; i<10; i++)
            {
                // Begin asynchronous operations.
                waitHandleArray[i] = 
                    myQueue.BeginReceive().AsyncWaitHandle;
            }

            // Specify to wait for all operations to return.
            WaitHandle.WaitAll(waitHandleArray);
         
            return;
        }


        //***************************************************
        // Provides an event handler for the ReceiveCompleted
        // event.
        //***************************************************
        
        private static void MyReceiveCompleted(Object source, 
            ReceiveCompletedEventArgs asyncResult)
        {
            try
            {
                // Connect to the queue.
                MessageQueue mq = (MessageQueue)source;
                
                // End the asynchronous receive operation.
                Message m = mq.EndReceive(asyncResult.AsyncResult);
        
                // Process the message here.
                Console.WriteLine("Message received.");

            }
            catch(MessageQueueException)
            {
                // Handle 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;
using namespace System::Threading;

__gc class MyNewQueue 
{
    // Provides an event handler for the ReceiveCompleted
    // event.

public:
    static void MyReceiveCompleted(Object* source, 
        ReceiveCompletedEventArgs* asyncResult) 
    {
        try 
        {
            // Connect to the queue.
            MessageQueue* mq = dynamic_cast<MessageQueue*>(source);

            // End the asynchronous receive operation.
            mq->EndReceive(asyncResult->AsyncResult);

            // Process the message here.
            Console::WriteLine(S"Message received.");

        }
        catch (MessageQueueException*) 
        {
            // Handle sources of MessageQueueException.
        }

        // Handle other exceptions.

        return; 
    }
};

// Provides an entry point into the application.
//         
// This example performs asynchronous receive
// 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 ReceiveCompleted event.
    myQueue->ReceiveCompleted += new ReceiveCompletedEventHandler(0, MyNewQueue::MyReceiveCompleted);

    // Define wait handles for multiple operations.
    WaitHandle* waitHandleArray[] = new WaitHandle*[10];
    for (int i=0; i<10; i++) 
    {
        // Begin asynchronous operations.
        waitHandleArray->Item[i] = myQueue->BeginReceive()->AsyncWaitHandle;
    }

    // Specify to wait for all operations to return.
    WaitHandle::WaitAll(waitHandleArray);

    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.BeginReceive オーバーロードの一覧 | EndReceive | ReceiveCompleted | BeginPeek | Receive | Peek