次の方法で共有


非同期プログラミング モデル (APM)

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 メソッドからスローされます。 同じEndOperationNameIAsyncResult メソッドを複数回呼び出す効果は定義されていません。 同様に、関連する Begin メソッドによって返されなかったEndOperationNameを使用してIAsyncResult メソッドを呼び出すことも定義されていません。

どちらの未定義シナリオの場合でも、実装者は InvalidOperationExceptionのスローを検討する必要があります。

この設計パターンの実装者は、 IsCompleted を true に設定し、非同期コールバック メソッド (指定されている場合) を呼び出し、 AsyncWaitHandleを通知することで、非同期操作が完了したことを呼び出し元に通知する必要があります。

アプリケーション開発者には、非同期操作の結果にアクセスするための設計上の選択肢がいくつかあります。 正しい選択は、操作の完了時に実行できる命令がアプリケーションにあるかどうかによって異なります。 非同期操作の結果を受け取るまでアプリケーションが追加の作業を実行できない場合、アプリケーションは結果が使用可能になるまでブロックする必要があります。 非同期操作が完了するまでブロックするには、次のいずれかの方法を使用できます。

非同期操作の完了中にブロックする必要がないアプリケーションでは、次のいずれかの方法を使用できます。

こちらも参照ください