イベント ベースの非同期パターンは、クラスの非同期動作を公開するためのパターンを提供します。 このパターンの導入により、.NET では、非同期動作を公開するための 2 つのパターン ( System.IAsyncResult インターフェイスに基づく非同期パターンとイベントベースのパターン) が定義されています。 この記事では、両方のパターンを実装するのが適切なタイミングについて説明します。
IAsyncResult インターフェイスを使用した非同期プログラミングの詳細については、「非同期プログラミング モデル (APM)」を参照してください。
一般的な原則
一般に、可能な限り、イベント ベースの非同期パターンを使用して非同期機能を公開する必要があります。 ただし、イベント ベースのパターンでは満たすことができない要件がいくつかあります。 このような場合は、イベント ベースのパターンに加えて、 IAsyncResult パターンの実装が必要になる場合があります。
注
イベント ベースのパターンも実装されていない場合、 IAsyncResult パターンを実装することはまれです。
ガイドライン
次の一覧では、イベント ベースの非同期パターンを実装する必要がある場合のガイドラインについて説明します。
イベント ベースのパターンを既定の API として使用して、クラスの非同期動作を公開します。
クラスが主にクライアント アプリケーション (Windows フォームなど) で使用されている場合は、 IAsyncResult パターンを公開しないでください。
要件を満たす必要がある場合にのみ、 IAsyncResult パターンを公開します。 たとえば、既存の API との互換性のために、 IAsyncResult パターンを公開する必要がある場合があります。
イベント ベースのパターンも公開せずに、 IAsyncResult パターンを公開しないでください。
IAsyncResult パターンを公開する必要がある場合は、詳細オプションとして公開します。 たとえば、プロキシ オブジェクトを生成する場合は、既定でイベント ベースのパターンを生成し、 IAsyncResult パターンを生成するオプションを指定します。
IAsyncResult パターンの実装に基づいて、イベントベースのパターン実装を構築します。
イベント ベースのパターンと IAsyncResult パターンの両方を同じクラスで公開しないようにします。 イベント ベースのパターンを "上位レベル" クラスに公開し、 IAsyncResult パターンを "下位レベル" クラスで公開します。 たとえば、WebClient コンポーネントのイベント ベースのパターンと、HttpRequest クラスのIAsyncResult パターンを比較します。
互換性が必要な場合は、イベント ベースのパターンと IAsyncResult パターンを同じクラスで公開します。 たとえば、 IAsyncResult パターンを使用する API を既にリリースしている場合は、下位互換性のために IAsyncResult パターンを保持する必要があります。
結果として得られるオブジェクト モデルの複雑さが実装を分離する利点を上回る場合は、イベント ベースのパターンと IAsyncResult パターンを同じクラスに公開します。 イベント ベースのパターンを公開しないようにするよりも、両方のパターンを 1 つのクラスで公開することをお勧めします。
イベント ベースのパターンと IAsyncResult パターンの両方を 1 つのクラスで公開する必要がある場合は、 EditorBrowsableAttributeAdvanced に設定して、 IAsyncResult パターンの実装を高度な機能としてマークします。 これは、visual Studio IntelliSense などのデザイン環境に対して、 IAsyncResult のプロパティとメソッドを表示しないことを示します。 これらのプロパティとメソッドは引き続き完全に使用できますが、IntelliSense を使用する開発者は API をより明確に表示できます。
イベント ベースのパターンに加えて IAsyncResult パターンを公開するための基準
イベント ベースの非同期パターンには、前述のシナリオで多くの利点がありますが、パフォーマンスが最も重要な要件であるかどうかを認識する必要があるいくつかの欠点があります。
イベント ベースのパターンが対処しないシナリオと、 IAsyncResult パターンの 3 つのシナリオがあります。
1 回の待機をブロックする IAsyncResult
多数の IAsyncResult オブジェクトの待機をブロックする
の完了をポーリングします。 IAsyncResult
これらのシナリオには、イベント ベースのパターンを使用して対処できますが、 IAsyncResult パターンを使用するよりも面倒です。
開発者は、通常、非常に高いパフォーマンス要件を持つサービスに対して IAsyncResult パターンを使用することがよくあります。 たとえば、完了のポーリング シナリオは、高パフォーマンスのサーバー手法です。
さらに、イベント ベースのパターンは、特にEventArgsオブジェクトの作成が多く、スレッド間で同期されるため、IAsyncResult パターンよりも効率が低くなります。
次の一覧は、 IAsyncResult パターンを使用する場合に従う必要があるいくつかの推奨事項を示しています。
WaitHandleまたはIAsyncResult オブジェクトのサポートが特に必要な場合にのみ、IAsyncResult パターンを公開します。
IAsyncResult パターンを使用する既存の API がある場合にのみ、IAsyncResult パターンを公開します。
IAsyncResult パターンに基づく既存の API がある場合は、次のリリースでイベント ベースのパターンも公開することを検討してください。
イベント ベースのパターンでは満たすことができないが、IAsyncResult パターンで満たすことができる高パフォーマンス要件がある場合にのみ、IAsyncResult パターンを公開します。
こちらも参照ください
.NET