次の方法で共有


MessageQueue.BeginReceive メソッド (TimeSpan, Object)

指定したタイムアウトと指定した状態オブジェクトを持つ非同期の受信操作を実行します。状態オブジェクトは、操作の有効期間を通じて関連付けられた情報を提供します。この操作は、メッセージをキューで使用できるようになる、タイムアウトが発生するまで完了しません。

Overloads Public Function BeginReceive( _
   ByVal timeout As TimeSpan, _   ByVal stateObject As Object _) As IAsyncResult
[C#]
public IAsyncResult BeginReceive(TimeSpantimeout,objectstateObject);
[C++]
public: IAsyncResult* BeginReceive(TimeSpantimeout,Object* stateObject);
[JScript]
public function BeginReceive(
   timeout : TimeSpan,stateObject : Object) : IAsyncResult;

パラメータ

  • timeout
    メッセージを使用できるようになるまでの待機時間を示す TimeSpan
  • stateObject
    非同期操作に関連付けられている情報を保持する状態オブジェクト。アプリケーションで指定します。

戻り値

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

例外

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

解説

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

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

このオーバーロードを使用して、情報を操作と関連付けます。これは、操作の有効期間を通じて保存されます。イベント ハンドラは、操作に関連付けられた IAsyncResultAsyncState プロパティを調べることで、この情報を検出できます。

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

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

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

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

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

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

状態オブジェクトは、状態情報を操作に関連付けます。たとえば、 BeginReceive を複数回呼び出して複数の操作を開始した場合、定義した個別の状態オブジェクトによって各操作を識別できます。

状態オブジェクトを使用して、プロセス スレッド間で情報を渡すこともできます。スレッドが開始され、コールバックが別のスレッドで非同期に発生する場合は、状態オブジェクトがマーシャリングされてイベントの情報と共に返されます。

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

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

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

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

必要条件

プラットフォーム: 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 | TimeSpan