[非同期プログラミング]非同期プログラミングモデル

   .NETは3つの非同期プログラミングモデルをサポートしています。

非同期プログラミングモデル(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();

  非同期操作が完了すると、あなたは、アプリケーションを停止する必要はありません、以下のいずれかの方法を使用することができます。

イベントベースの非同期モード(EAP)

  これらのアプリケーションは、通常、マルチスレッド設計の使用を実現するために必要とされる複数のタスクを同時に実行し、それでもユーザーとの対話に応答できます。

  比較的単純なマルチスレッド・アプリケーションのために、BackgroundWorkerのの  成分は、簡単な解決策を提供します。 より洗練された非同期アプリケーションでは、イベントを満たすクラスベースの非同期パターンの実装を検討。

  これは、非同期モードのイベントクラスが1つのまたは複数の名前がありますサポートして  メソッド名非同期メソッドを。 これらの方法は、画像の同期されたバージョンを作成することができる、同期バージョンは、現在のスレッド上で同じ操作を実行します。 クラスはまた有していてもよい  methodNameにイベントを完了し、有していてもよい  メソッド名 AsyncCancel(または単にCancelAsync)方法。ピクチャは、  イベントベースの非同期モードのサポートの典型的な構成要素です。 

タスクベースの非同期パターン(TAP)

  タスクベースの非同期モード(TAP)は、非同期動作を開始し、完了の単一の方法を用いて発現させました。

TAP生成方法

コンパイラ

  いずれかに起因する  async キーワードは非同期メソッドとみなされる方法。

手動TAPを生成する方法

   自分のTAPを実現するには、作成する必要があり  TaskCompletionSource <TResult>  非同期操作を実行することを目的とし、操作が完了したときに、呼び出す  setResultsetExceptionsetCanceled  方法、またはこれらの方法の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  クラスは、非同期計算時間、場所及び方法の実行の重要な制御を提供し、効果的な実施のための特別なサポートを提供します。

  次の方法で生成計算集約タスク:

I / O集中型のタスク

   タスクは直接スレッドで実行される全体でサポートするべきではありません作成するには、使用  TaskCompletionSource <TResult>  のタイプを。 このタイプのリターンに関連付けられて記載されている  タスク  インスタンス  タスク<TResult>  プロパティを。 このタスクのライフサイクル  TaskCompletionSource <TResult>  の制御方法、そのような  setResultsetExceptionsetCanceled  およびそれらの  TrySet 変形。

計算集約的およびI / O強力な混合タスク

  方法は、非同期計算集約またはI / O集中型の操作に限定されるものではなく、また、両者の組み合わせであってもよいです。

 

 

おすすめ

転載: www.cnblogs.com/amytal/p/11722466.html