非同期のメッセージ処理
更新 : 2007 年 11 月
アプリケーションの処理を停止せずにメッセージを取得するには、メッセージを非同期で取得します。非同期のメッセージ処理では、タスクを開始したメソッドが結果を待たずにすぐに戻ります。アプリケーションは、タスクが完了するまでの間も、それまで実行していた処理を続けることができます。タスクが完了したときに、サーバーはメッセージが正しく処理されたことをアプリケーションに通知します。
非同期のメッセージ操作には、メッセージの非同期取得とメッセージの非同期ピークの 2 種類があります。メッセージを非同期で取得する場合は、BeginReceive メソッドと EndReceive メソッドを使用して、操作の開始と終了を示します。動作は、次のように行われます。
BeginReceive メソッドはすぐに戻り、メッセージがキューに到着したときか、ピーク対象または取得対象のメッセージが既にキューに存在する場合に、ReceiveCompleted というイベントを発生させます。
ReceiveCompleted イベントは、非同期操作に関する情報を含む IAsyncResult 型のオブジェクトを返します。
完了イベントを受け取ったら、EndReceive メソッドを呼び出して操作を完了します。終了呼び出しの中で ReceiveCompletedEventArgs クラスにアクセスして、メッセージにアクセスしたりメッセージを取得したりできます。
この操作の間、任意の時点で IAsyncResult オブジェクトにアクセスできますが、一般には EndReceive を呼び出すまでは使用しません。ただし、いくつかの非同期操作を開始した場合は、各操作の IAsyncResult 値を配列に格納して、すべての操作の完了を待つか、または個別の操作の完了を待つかを指定できます。その場合は、IAsyncResult オブジェクトの AsyncWaitHandle プロパティを使用して、完了した操作を識別できます。
Peek では、Receive と同様に、BeginPeek と EndPeek という 2 つのメソッドを使用して、非同期操作の最初と最後を囲みます。BeginPeek はすぐに戻り、メッセージが使用可能になったときに PeekCompleted イベントを発生させます。ReceiveCompleted と同様に、このイベントは、操作に関する情報を得るために使用できる IAsyncResult オブジェクトを返します。
また、非同期取得と非同期ピークのどちらの操作でも、タイムアウト期限を使用して、メッセージが到着するまでの待機時間を指定できます。これを行うには、いずれかのメソッドのオーバーロードされた形式を使用して、待機時間を指定する TimeSpan オブジェクトを渡します。タイムアウト期限が切れた場合は ReceiveCompleted イベントまたは PeekCompleted イベントが発生しますが、IAsyncResult オブジェクトの IsCompleted プロパティが false に設定され、メッセージが処理されなかったことを表します。
非同期処理の詳細については、以下のトピックを参照してください。
目的 |
参照項目 |
---|---|
メッセージを非同期で取得するための詳細な手順 |
|
BeginPeek メソッドとそのメンバの概要 |
|
BeginReceive メソッドとそのメンバの概要 |
非同期操作の通知の受信
非同期の取得またはピーク操作が正常に完了したときに通知を受け取るには、次の 2 つの方法があります。
ReceiveCompleted イベントまたは PeekCompleted イベントの発生時にそのイベントを処理するイベント ハンドラを作成する。
コールバックを使用して、受信メッセージを自動的に監視し、メッセージが到着したときにアプリケーションに処理を渡す。
イベント通知を使用する場合は、メッセージを処理して処理の完了時に通知を返すメソッドを作成します。このメソッドを呼び出すと、非同期処理が開始されます。デザイナで MessageQueue コンポーネントをダブルクリックすると、システムが自動的にイベント ハンドラを作成します。
メモ : |
---|
イベント通知を使用する場合、BeginPeek または BeginReceive は 1 つのメッセージを返したら処理を停止します。取得する各メッセージに対して、もう一度 BeginPeek または BeginReceive を呼び出す必要があります。 |
メッセージを非同期で処理するもう 1 つの方法は、コールバックを使用する方法です。コールバックは、BeginPeek または BeginReceive 操作に関連付けるデリゲートを識別します。この場合は、各メッセージを処理した後に、新しいイベント通知をデリゲートが引き続き監視します。