.NETは3つの非同期プログラミングモデルをサポートしています。
-
非同期プログラミングモデル(APM) (レガシー)
-
イベントベースの非同期モード(EAP) (レガシー)
-
タスクベースの非同期パターン(TAP) (新規開発を推奨)
非同期プログラミングモデル(APM)
使用し たIAsyncResultの 非同期操作によって呼び出されたデザインパターンを BeginOperationName
し、 EndOperationName
2つのメソッドを達成するために、2つの方法が、非同期操作のoperationNameの開始と終了です。 例えば、 のFileStream クラスが提供 BeginRead と EndRead 非同期ファイルからバイトを読み取る方法。 これらの2つの方法は、達成するために 読むの 方法の非同期バージョン。
コールでは BeginOperationName
、アプリケーションが非同期操作が別のスレッドで実行されている間、呼び出し元のスレッド上でコマンドを実行し続けることができます。 各呼び出しは BeginOperationName
、アプリケーションが呼び出す必要があり EndOperationName
、操作を取得するために、結果を。
BeginOperationName
メソッドシグネチャ宣言(転送または参照により送達値による)の同期バージョンを使用して、任意のパラメータの方法。 BeginOperationName
メソッドのシグネチャは、任意の出力パラメータが含まれていません。 BeginOperationName
署名の方法はまた、2つの他のパラメータを含みます。 最初のパラメータが定義 AsyncCallbackの 非同期操作がデリゲートで参照完了したときにメソッドが呼び出され、デリゲート。 操作が完了した後、呼び出し側がメソッドを呼び出したくない場合は、それを指定することができます null
。 第2のパラメータは、ユーザー定義オブジェクトです。 この方法は、非同期転送アプリケーション固有のステータス情報に、このオブジェクトの操作を完了するために利用可能な呼び出し。
あなたが呼ぶと EndOperationName
するとき は、IAsyncResult このオブジェクトによって表される、非同期操作が完了していない、それが EndOperationName
非同期操作が完了するまで、呼び出し元のスレッドをブロックします。
アプリケーションが非同期操作の結果を受け取る前に他の作業を実行できない場合は、まずこれらの結果は、他の作業を行う取得する前にアプリケーションを停止する必要があります。 非同期操作が完了する前にアプリケーションを防ぐために、次のいずれかの方法を使用することができます。
- アプリケーションの呼び出しのメインスレッドからは
EndOperationName
、操作が完了した後まで進む前に、アプリケーションの実行を防ぎます。 - 使用 AsyncWaitHandleを 1つ以上の操作が完了するまで、アプリケーションの実行を防ぐために。result.AsyncWaitHandle.WaitOne();
非同期操作が完了すると、あなたは、アプリケーションを停止する必要はありません、以下のいずれかの方法を使用することができます。
-
ポーリング動作は、次のように状況に完成されています。定期的にチェック 完了するの 操作が完了すると呼び出し、プロパティを
EndOperationName
。 このことを示す例については、 ステータスポーリングの非同期操作を。 -
使用 AsyncCallbackの 操作が完了したときに呼び出されるメソッドを指定するには、デリゲートを。 このことを示す例については、 使用AsyncCallbackは、非同期操作の終了を委任する。
イベントベースの非同期モード(EAP)
これらのアプリケーションは、通常、マルチスレッド設計の使用を実現するために必要とされる複数のタスクを同時に実行し、それでもユーザーとの対話に応答できます。
比較的単純なマルチスレッド・アプリケーションのために、BackgroundWorkerのの 成分は、簡単な解決策を提供します。 より洗練された非同期アプリケーションでは、イベントを満たすクラスベースの非同期パターンの実装を検討。
これは、非同期モードのイベントクラスが1つのまたは複数の名前がありますサポートして メソッド名非同期メソッドを。 これらの方法は、画像の同期されたバージョンを作成することができる、同期バージョンは、現在のスレッド上で同じ操作を実行します。 クラスはまた有していてもよい methodNameにイベントを完了し、有していてもよい メソッド名 AsyncCancel(または単にCancelAsync)方法。ピクチャは、 イベントベースの非同期モードのサポートの典型的な構成要素です。
タスクベースの非同期パターン(TAP)
タスクベースの非同期モード(TAP)は、非同期動作を開始し、完了の単一の方法を用いて発現させました。
TAP生成方法
コンパイラ
いずれかに起因する async
キーワードは非同期メソッドとみなされる方法。
手動TAPを生成する方法
自分のTAPを実現するには、作成する必要があり TaskCompletionSource <TResult> 非同期操作を実行することを目的とし、操作が完了したときに、呼び出す setResult、setException、setCanceled 方法、またはこれらの方法の1の呼び出しTry
のバージョンを。
パブリック静的タスク<整数> ReadTask(このストリームのストリーム、バイト[]バッファ、オフセットINT、INT数、オブジェクトの状態) { VaRのTCS =新しいTaskCompletionSource <整数>(); stream.BeginRead(バッファ、オフセット、カウント、AR => { {tcs.SetResult(stream.EndRead(AR))試みます。} キャッチ(例外EXC){tcs.SetException(EXC)。} }、状態)。 tcs.Taskを返します。 }
ワークロード
それは純粋な計算であれば、集中メソッドは、同期を達成するために開いている必要があります。 この方法は、I / O集約型である場合、のみ開示されている非同期として実装されるべきです。
計算集約型のタスク
System.Threading.Tasks.Taskの クラスは、計算集約的な操作のために表されています。 デフォルトでは、使用して のThreadPool クラスは、非同期計算時間、場所及び方法の実行の重要な制御を提供し、効果的な実施のための特別なサポートを提供します。
次の方法で生成計算集約タスク:
- .NET Framework 4の使用で TaskFactory.StartNew 非同期実行手数料を受け付ける方法、(典型的には アクション<T> または のFunc <TResult> )。
- 静的使用(.NETコアおよび.NET標準を含む)の.NET Framework 4.5以降で Task.Runの ような方法を TaskFactory.StartNewの ショートカット。
- あなたは、タスクを生成して、スケジュールしたい場合には、使用
Task
タイプまたはStart
コンストラクタメソッドを。 - 使用 Task.ContinueWith オーバーロードされたメソッドを。
- 使用 TaskFactory.ContinueWhenAll と TaskFactory.ContinueWhenAny 方法を。
I / O集中型のタスク
タスクは直接スレッドで実行される全体でサポートするべきではありません作成するには、使用 TaskCompletionSource <TResult> のタイプを。 このタイプのリターンに関連付けられて記載されている タスク インスタンス タスク<TResult> プロパティを。 このタスクのライフサイクル TaskCompletionSource <TResult> の制御方法、そのような setResult、setException、setCanceled およびそれらの TrySet
変形。
計算集約的およびI / O強力な混合タスク
方法は、非同期計算集約またはI / O集中型の操作に限定されるものではなく、また、両者の組み合わせであってもよいです。