IAsyncResultデザイン パターンを使用する非同期操作は、それぞれ非同期操作 BeginOperationName
を開始および終了する EndOperationName
および という名前の 2 つのメソッドとして実装されます。 たとえば、 FileStream クラスは、ファイルからバイトを非同期的に読み取るための BeginRead メソッドと EndRead メソッドを提供します。 これらのメソッドは、 Read メソッドの非同期バージョンを実装します。
注
.NET Framework 4 以降、タスク並列ライブラリには、非同期および並列プログラミング用の新しいモデルが用意されています。 詳細については、「 タスク並列ライブラリ (TPL) 」および 「タスク ベースの非同期パターン (TAP)」を参照してください。
BeginOperationName
を呼び出した後、非同期操作が別のスレッドで実行されている間、アプリケーションは呼び出し元のスレッドで命令の実行を続行できます。
BeginOperationName
の呼び出しごとに、アプリケーションはEndOperationName
を呼び出して操作の結果を取得する必要もあります。
非同期操作の開始
BeginOperationName
メソッドは、非同期操作 OperationName を開始し、IAsyncResult インターフェイスを実装するオブジェクトを返します。
IAsyncResult オブジェクトには、非同期操作に関する情報が格納されます。 次の表は、非同期操作に関する情報を示しています。
メンバー | 説明 |
---|---|
AsyncState | 非同期操作に関する情報を含む省略可能なアプリケーション固有のオブジェクト。 |
AsyncWaitHandle | 非同期操作が完了するまでアプリケーションの実行をブロックするために使用できる WaitHandle 。 |
CompletedSynchronously | 別のBeginOperationName スレッドで完了するのではなく、ThreadPoolの呼び出しに使用されるスレッドで非同期操作が完了したかどうかを示す値。 |
IsCompleted | 非同期操作が完了したかどうかを示す値。 |
BeginOperationName
メソッドは、値または参照によって渡されるメソッドの同期バージョンのシグネチャで宣言されたすべてのパラメーターを受け取ります。 out パラメーターは、 BeginOperationName
メソッド シグネチャの一部ではありません。
BeginOperationName
メソッド シグネチャには、2 つの追加パラメーターも含まれています。 これらの 1 つ目は、非同期操作の完了時に呼び出されるメソッドを参照する AsyncCallback デリゲートを定義します。 呼び出し元は、操作の完了時にメソッドを呼び出したくない場合は、 null
(Visual Basic でNothing
) を指定できます。 2 番目の追加パラメーターは、ユーザー定義オブジェクトです。 このオブジェクトを使用すると、非同期操作が完了したときに呼び出されたメソッドにアプリケーション固有の状態情報を渡すことができます。
BeginOperationName
メソッドが、ファイルから読み取ったバイトを格納するバイト配列などの追加の操作固有のパラメーターを受け取る場合、AsyncCallbackおよびアプリケーション状態オブジェクトは、BeginOperationName
メソッド シグネチャの最後のパラメーターです。
BeginOperationName
は、呼び出し元のスレッドに直ちに制御を返します。
BeginOperationName
メソッドが例外をスローすると、非同期操作が開始される前に例外がスローされます。
BeginOperationName
メソッドが例外をスローした場合、コールバック メソッドは呼び出されません。
非同期操作の終了
EndOperationName
メソッドは、非同期操作 OperationName を終了します。
EndOperationName
メソッドの戻り値は、対応する同期メソッドによって返されるのと同じ型であり、非同期操作に固有です。 たとえば、 EndRead メソッドは FileStream から読み取られたバイト数を返し、 EndGetHostByName メソッドはホスト コンピューターに関する情報を含む IPHostEntry オブジェクトを返します。
EndOperationName
メソッドは、メソッドの同期バージョンのシグネチャで宣言された out パラメーターまたは ref パラメーターを受け取ります。
EndOperationName
メソッドには、同期メソッドのパラメーターに加えて、IAsyncResult パラメーターも含まれています。 呼び出し元は、対応する呼び出しによって返されたインスタンスを BeginOperationName
に渡す必要があります。
IAsyncResultが呼び出されたときにEndOperationName
オブジェクトによって表される非同期操作が完了していない場合、EndOperationName
は非同期操作が完了するまで呼び出し元のスレッドをブロックします。 非同期操作によってスローされた例外は、EndOperationName
メソッドからスローされます。 同じEndOperationName
でIAsyncResult メソッドを複数回呼び出す効果は定義されていません。 同様に、関連する Begin メソッドによって返されなかったEndOperationName
を使用してIAsyncResult メソッドを呼び出すことも定義されていません。
注
どちらの未定義シナリオの場合でも、実装者は InvalidOperationExceptionのスローを検討する必要があります。
注
この設計パターンの実装者は、 IsCompleted を true に設定し、非同期コールバック メソッド (指定されている場合) を呼び出し、 AsyncWaitHandleを通知することで、非同期操作が完了したことを呼び出し元に通知する必要があります。
アプリケーション開発者には、非同期操作の結果にアクセスするための設計上の選択肢がいくつかあります。 正しい選択は、操作の完了時に実行できる命令がアプリケーションにあるかどうかによって異なります。 非同期操作の結果を受け取るまでアプリケーションが追加の作業を実行できない場合、アプリケーションは結果が使用可能になるまでブロックする必要があります。 非同期操作が完了するまでブロックするには、次のいずれかの方法を使用できます。
アプリケーションのメイン スレッドから
EndOperationName
を呼び出し、操作が完了するまでアプリケーションの実行をブロックします。 この手法を示す例については、「 非同期操作を終了してアプリケーションの実行をブロックする」を参照してください。AsyncWaitHandleを使用して、1 つ以上の操作が完了するまでアプリケーションの実行をブロックします。 この手法を示す例については、「 AsyncWaitHandle を使用したアプリケーション実行のブロック」を参照してください。
非同期操作の完了中にブロックする必要がないアプリケーションでは、次のいずれかの方法を使用できます。
IsCompleted プロパティを定期的に確認し、操作が完了したときに
EndOperationName
を呼び出して、操作の完了状態をポーリングします。 この手法を示す例については、「 非同期操作の状態のポーリング」を参照してください。操作の完了時に呼び出すメソッドを指定するには、 AsyncCallback デリゲートを使用します。 この手法を示す例については、「 AsyncCallback デリゲートを使用した非同期操作の終了」を参照してください。
こちらも参照ください
.NET