次の方法で共有


MessageQueue.BeginReceive メソッド (TimeSpan)

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

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

パラメータ

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

戻り値

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

例外

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

解説

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

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

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

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

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

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

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

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

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

メモ   トランザクションに対して 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