非同期のメッセージ処理

更新 : 2007 年 11 月

アプリケーションの処理を停止せずにメッセージを取得するには、メッセージを非同期で取得します。非同期のメッセージ処理では、タスクを開始したメソッドが結果を待たずにすぐに戻ります。アプリケーションは、タスクが完了するまでの間も、それまで実行していた処理を続けることができます。タスクが完了したときに、サーバーはメッセージが正しく処理されたことをアプリケーションに通知します。

非同期のメッセージ操作には、メッセージの非同期取得とメッセージの非同期ピークの 2 種類があります。メッセージを非同期で取得する場合は、BeginReceive メソッドと EndReceive メソッドを使用して、操作の開始と終了を示します。動作は、次のように行われます。

  • BeginReceive メソッドはすぐに戻り、メッセージがキューに到着したときか、ピーク対象または取得対象のメッセージが既にキューに存在する場合に、ReceiveCompleted というイベントを発生させます。

  • ReceiveCompleted イベントは、非同期操作に関する情報を含む IAsyncResult 型のオブジェクトを返します。

  • 完了イベントを受け取ったら、EndReceive メソッドを呼び出して操作を完了します。終了呼び出しの中で ReceiveCompletedEventArgs クラスにアクセスして、メッセージにアクセスしたりメッセージを取得したりできます。

この操作の間、任意の時点で IAsyncResult オブジェクトにアクセスできますが、一般には EndReceive を呼び出すまでは使用しません。ただし、いくつかの非同期操作を開始した場合は、各操作の IAsyncResult 値を配列に格納して、すべての操作の完了を待つか、または個別の操作の完了を待つかを指定できます。その場合は、IAsyncResult オブジェクトの AsyncWaitHandle プロパティを使用して、完了した操作を識別できます。

Peek では、Receive と同様に、BeginPeekEndPeek という 2 つのメソッドを使用して、非同期操作の最初と最後を囲みます。BeginPeek はすぐに戻り、メッセージが使用可能になったときに PeekCompleted イベントを発生させます。ReceiveCompleted と同様に、このイベントは、操作に関する情報を得るために使用できる IAsyncResult オブジェクトを返します。

また、非同期取得と非同期ピークのどちらの操作でも、タイムアウト期限を使用して、メッセージが到着するまでの待機時間を指定できます。これを行うには、いずれかのメソッドのオーバーロードされた形式を使用して、待機時間を指定する TimeSpan オブジェクトを渡します。タイムアウト期限が切れた場合は ReceiveCompleted イベントまたは PeekCompleted イベントが発生しますが、IAsyncResult オブジェクトの IsCompleted プロパティが false に設定され、メッセージが処理されなかったことを表します。

非同期処理の詳細については、以下のトピックを参照してください。

目的

参照項目

メッセージを非同期で取得するための詳細な手順

方法 : メッセージを非同期で取得する

BeginPeek メソッドとそのメンバの概要

BeginPeek

BeginReceive メソッドとそのメンバの概要

BeginReceive

非同期操作の通知の受信

非同期の取得またはピーク操作が正常に完了したときに通知を受け取るには、次の 2 つの方法があります。

  • ReceiveCompleted イベントまたは PeekCompleted イベントの発生時にそのイベントを処理するイベント ハンドラを作成する。

  • コールバックを使用して、受信メッセージを自動的に監視し、メッセージが到着したときにアプリケーションに処理を渡す。

イベント通知を使用する場合は、メッセージを処理して処理の完了時に通知を返すメソッドを作成します。このメソッドを呼び出すと、非同期処理が開始されます。デザイナで MessageQueue コンポーネントをダブルクリックすると、システムが自動的にイベント ハンドラを作成します。

7ch3stsw.alert_note(ja-jp,VS.90).gifメモ :

イベント通知を使用する場合、BeginPeek または BeginReceive は 1 つのメッセージを返したら処理を停止します。取得する各メッセージに対して、もう一度 BeginPeek または BeginReceive を呼び出す必要があります。

メッセージを非同期で処理するもう 1 つの方法は、コールバックを使用する方法です。コールバックは、BeginPeek または BeginReceive 操作に関連付けるデリゲートを識別します。この場合は、各メッセージを処理した後に、新しいイベント通知をデリゲートが引き続き監視します。

参照

処理手順

方法 : メッセージを非同期で取得する

方法 : メッセージをピークする

方法 : プログラムでメッセージを取得する

その他の技術情報

メッセージの読み取りと受信