非同期呼び出しの作成と処理

COM オブジェクトは、非同期呼び出しをサポートできます。 クライアントが非同期呼び出しを行うと、クライアントに制御が直ちに戻ります。 サーバーが呼び出しを処理している間、クライアントは他の作業を自由に行うことができます。 呼び出しの結果がなくてもクライアントが処理を続行できなくなった場合は、その時点で呼び出しの結果を取得できます。

たとえば、大規模または複雑なレコードセットに対する要求には時間がかかることがあります。 クライアントは、非同期呼び出しによってレコードセットを要求した後、他の処理を実行できます。 レコードセットが使用可能になると、クライアントはブロックを行わずにすばやく取得できます。

クライアントは、サーバーオブジェクトに対して直接非同期呼び出しを行いません。 代わりに、サーバーオブジェクトで非同期バージョンの同期インターフェイスを実装する呼び出しオブジェクトを取得します。 呼び出しオブジェクトの非同期インターフェイスには、Async InterfaceName という形式の名前が付いています。 たとえば、サーバーオブジェクトが IMyInterface という名前の同期インターフェイスを実装している場合、AsyncIMyInterface という名前の非同期インターフェイスを実装する call オブジェクトが存在します。

注意

Idispatch または idispatch を継承するインターフェイスでは、非同期サポートは使用できません。

 

非同期呼び出しをサポートするサーバーオブジェクトは、 Icallfactory インターフェイスを実装します。 このインターフェイスは、指定された呼び出しオブジェクトのインスタンスを作成する、 CreateCallという1つのメソッドを公開します。 クライアントは Icallfactory を照会して、オブジェクトが非同期呼び出しをサポートしているかどうかを判断できます。

同期インターフェイスのメソッドごとに、対応する非同期インターフェイスは2つのメソッドを実装します。 これらのメソッドは、Begin _ と Finish のプレフィックス _ を同期メソッドの名前に関連付けます。 たとえば、ISimpleStream という名前のインターフェイスに Read メソッドがある場合、AsyncISimpleStream インターフェイスは Begin _ read メソッドと Finish _ read メソッドを持ちます。 非同期呼び出しを開始するために、クライアントは Begin _ メソッドを呼び出します。

サーバーオブジェクトを実装する場合、オブジェクトが実装するすべてのインターフェイスに対して呼び出しオブジェクトを提供する必要はありません。 サーバーオブジェクトが Icallfactory インターフェイスを実装し、標準のマーシャリングを使用する場合、サーバー側に呼び出しオブジェクトが存在しない場合でも、マーシャリングされたクライアントは常にプロキシ呼び出しオブジェクトを取得できます。 このプロキシは、Begin _ メソッドを同期呼び出しとしてマーシャリングし、サーバーはその呼び出しを同期的に処理します。また、クライアントは、完了メソッドを呼び出すことによって out パラメーターを取得でき _ ます。

逆に、サーバー側で呼び出しオブジェクトが存在するインターフェイスで、クライアントがマーシャリングされた同期呼び出しを行う場合、サーバーは常に呼び出しを非同期的に処理します。 この動作はクライアントには見えません。クライアントは、同期メソッドから受け取ったのと同じ出力パラメーターと同じ戻り値を受け取るためです。

どちらの場合も、クライアントとサーバーの間の対話は、呼び出しが同期されているかのようにマーシャリングされます。同期プロキシと非同期プロキシの出力は、対応するスタブの出力と同様に区別できません。 この動作により、クライアントとサーバーの両方のプログラミングモデルが大幅に簡素化されます。 サーバーオブジェクトが Icallfactoryを実装する場合、マーシャリングされたクライアントは、使用できない可能性がある呼び出しオブジェクトをクライアントに作成する必要はありません。呼び出しオブジェクトは常に使用できます。

クライアントとサーバーが同じアパートメント内にある場合、サーバーオブジェクトはクライアントが行う呼び出しのいずれかを処理します。 呼び出しオブジェクトを使用できない場合、クライアントは明示的に同期インターフェイスを取得し、同期呼び出しを行う必要があります。

詳細については、次のトピックを参照してください。