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

IAsyncResult デザイン パターンを使用する非同期操作は BeginOperationNameEndOperationName という名前の、各 OperationName 非同期操作を開始および終了する 2 種類のメソッドとして実装されます。An asynchronous operation that uses the IAsyncResult design pattern is implemented as two methods named BeginOperationName and EndOperationName that begin and end the asynchronous operation OperationName respectively. たとえば、 FileStream クラスは、 BeginRead および EndRead メソッドを提供して、非同期的にファイルからバイトを読み取ります。For example, the FileStream class provides the BeginRead and EndRead methods to asynchronously read bytes from a file. これらのメソッドは非同期バージョンの Read メソッドを実装します。These methods implement the asynchronous version of the Read method.

注意

.NET Framework 4 以降では、タスク並列ライブラリによって非同期/並列プログラミングの新しいモデルが提供されます。Starting with the .NET Framework 4, the Task Parallel Library provides a new model for asynchronous and parallel programming. 詳細については、「 Task Parallel Library (TPL) 」および「 Task-based Asynchronous Pattern (TAP)」を参照してください。For more information, see Task Parallel Library (TPL) and Task-based Asynchronous Pattern (TAP)).

BeginOperationName を呼び出した後、アプリケーションは別のスレッドで非同期操作が行われている間も、スレッドの呼び出しに関する命令の実行を続行できます。After calling BeginOperationName, an application can continue executing instructions on the calling thread while the asynchronous operation takes place on a different thread. BeginOperationName の呼び出しごとに、アプリケーションでは EndOperationName も呼び出して、操作の結果を取得する必要があります。For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation.

非同期操作の開始Beginning an Asynchronous Operation

BeginOperationName メソッドは非同期操作 OperationName を開始し、IAsyncResult インターフェイスを実装するオブジェクトを返します。The BeginOperationName method begins asynchronous operation OperationName and returns an object that implements the IAsyncResult interface. IAsyncResult オブジェクトは非同期操作に関する情報を格納します。IAsyncResult objects store information about an asynchronous operation. 非同期操作に関する情報を次の表に示します。The following table shows information about an asynchronous operation.

メンバーMember 説明Description
AsyncState 非同期操作についての情報を格納するオプションのアプリケーション固有オブジェクト。An optional application-specific object that contains information about the asynchronous operation.
AsyncWaitHandle WaitHandle 。非同期操作が完了するまでアプリケーションの実行をブロックするために使用できます。A WaitHandle that can be used to block application execution until the asynchronous operation completes.
CompletedSynchronously 非同期操作が別の ThreadPool スレッドで完了する代わりに、BeginOperationName の呼び出しに使用されたスレッドで完了したかどうかを示す値。A value that indicates whether the asynchronous operation completed on the thread used to call BeginOperationName instead of completing on a separate ThreadPool thread.
IsCompleted 非同期操作が完了したかどうかを示す値。A value that indicates whether the asynchronous operation has completed.

BeginOperationName メソッドは、同期バージョンのメソッドのシグネチャで宣言された、値渡しまたは参照渡しのパラメーターを受け取ります。A BeginOperationName method takes any parameters declared in the signature of the synchronous version of the method that are passed by value or by reference. どの out パラメーターも、BeginOperationName メソッド シグネチャの一部ではありません。Any out parameters are not part of the BeginOperationName method signature. BeginOperationName メソッド シグネチャには、2 種類の追加のパラメーターが含まれます。The BeginOperationName method signature also includes two additional parameters. 1 つ目のパラメーターは、非同期操作が完了したときに呼び出されるメソッドを参照する AsyncCallback デリゲートを定義します。The first of these defines an AsyncCallback delegate that references a method that is called when the asynchronous operation completes. 操作完了時にメソッドを呼び出さない場合、呼び出し元は null (Visual Basic ではNothing ) を指定できます。The caller can specify null (Nothing in Visual Basic) if it does not want a method invoked when the operation completes. 2 つ目の追加のパラメーターは、ユーザー定義オブジェクトです。The second additional parameter is a user-defined object. このオブジェクトは、アプリケーション固有の状態情報を、非同期操作が完了したときに呼び出されるメソッドに渡すために使用できます。This object can be used to pass application-specific state information to the method invoked when the asynchronous operation completes. BeginOperationName メソッドが、ファイルから読み取ったバイトを格納するバイト配列など操作固有の追加のパラメーターを受け取る場合は、AsyncCallback とアプリケーション状態オブジェクトが BeginOperationName メソッド シグネチャの最後のパラメーターになります。If a BeginOperationName method takes additional operation-specific parameters, such as a byte array to store bytes read from a file, the AsyncCallback and application state object are the last parameters in the BeginOperationName method signature.

BeginOperationName は、瞬時にコントロールを呼び出し元スレッドに返します。BeginOperationName returns control to the calling thread immediately. BeginOperationName メソッドが例外をスローする場合は、非同期操作が開始される前に例外がスローされます。If the BeginOperationName method throws exceptions, the exceptions are thrown before the asynchronous operation is started. BeginOperationName メソッドが例外をスローする場合、コールバック メソッドは呼び出されません。If the BeginOperationName method throws exceptions, the callback method is not invoked.

非同期操作の終了Ending an Asynchronous Operation

EndOperationName メソッドは非同期操作の OperationName を終了します。The EndOperationName method ends asynchronous operation OperationName. EndOperationName メソッドの戻り値は、このメソッドの対応する同期操作によって返される型と同じ型であり、非同期操作に固有です。The return value of the EndOperationName method is the same type returned by its synchronous counterpart and is specific to the asynchronous operation. たとえば、 EndRead メソッドは FileStream から読み取ったバイト数を返し、 EndGetHostByName メソッドはホスト コンピューターに関する情報を含む IPHostEntry オブジェクトを返します。For example, the EndRead method returns the number of bytes read from a FileStream and the EndGetHostByName method returns an IPHostEntry object that contains information about a host computer. EndOperationName メソッドは、メソッドの同期バージョンのシグネチャで宣言された out パラメーターや ref パラメーターをすべて受け取ります。The EndOperationName method takes any out or ref parameters declared in the signature of the synchronous version of the method. EndOperationName メソッドには、同期メソッドからのパラメーターに加えて IAsyncResult パラメーターが含まれています。In addition to the parameters from the synchronous method, the EndOperationName method also includes an IAsyncResult parameter. 呼び出し元は、対応する呼び出しから返されたインスタンスを BeginOperationName に渡す必要があります。Callers must pass the instance returned by the corresponding call to BeginOperationName.

EndOperationName が呼び出されるときに IAsyncResult オブジェクトによって表される非同期操作が完了していない場合、EndOperationName は非同期操作が完了するまで、呼び出し元スレッドをブロックします。If the asynchronous operation represented by the IAsyncResult object has not completed when EndOperationName is called, EndOperationName blocks the calling thread until the asynchronous operation is complete. 非同期操作によってスローされた例外は、EndOperationName メソッドからスローされます。Exceptions thrown by the asynchronous operation are thrown from the EndOperationName method. 同じ IAsyncResult を使用して EndOperationName メソッドを複数回呼び出す場合の効果は定義されません。The effect of calling the EndOperationName method multiple times with the same IAsyncResult is not defined. 同様に、関連する Begin メソッドによって返されたのではない IAsyncResult を使用した EndOperationName メソッドの呼び出しも定義されません。Likewise, calling the EndOperationName method with an IAsyncResult that was not returned by the related Begin method is also not defined.

注意

どちらの未定義シナリオの場合でも、実装者は InvalidOperationExceptionのスローを検討する必要があります。For either of the undefined scenarios, implementers should consider throwing InvalidOperationException.

注意

このデザイン パターンの実装者は IsCompleted を true に設定し、非同期コールバック メソッドを呼び出して (指定されている場合)、 AsyncWaitHandleをシグナリングすることで、非同期操作の完了を呼び出し元に通知する必要があります。Implementers of this design pattern should notify the caller that the asynchronous operation completed by setting IsCompleted to true, calling the asynchronous callback method (if one was specified) and signaling the AsyncWaitHandle.

アプリケーション開発者には、非同期操作の結果にアクセスするための、デザイン上の選択肢がいくつかあります。Application developers have several design choices for accessing the results of the asynchronous operation. どの選択が適切になるかは、アプリケーションが操作の完了前に実行できる命令を持っているかどうかによって変わります。The correct choice depends on whether the application has instructions that can execute while the operation completes. 非同期操作の結果を受け取るまで、アプリケーションが別の作業を実行できない場合は、結果が使用可能になるまで、そのアプリケーションをブロックする必要があります。If an application cannot perform any additional work until it receives the results of the asynchronous operation, the application must block until the results are available. 非同期操作が完了するまでブロックするには、次に示す方法の 1 つを使用します。To block until an asynchronous operation completes, you can use one of the following approaches:

非同期操作が完了するまでアプリケーションをブロックする必要がない場合は、次のいずれかの方法を使用します。Applications that do not need to block while the asynchronous operation completes can use one of the following approaches:

関連項目See also