メソッド呼び出しのキャンセル

分散アプリケーションとWebベースアプリケーションの導入により、一部のメソッド呼び出しが返されるまでに許容できないほど長い時間がかかる場合があります。 ネットワーク接続の待機時間が長い場合、サーバーコンピューターが多数のクライアントにサービスを提供している場合、またはサーバーコンポーネントがマルチメディアファイルなどの大量のデータを渡している場合があります。 ユーザーは、時間がかかりすぎる要求をキャンセルできる必要があります。また、アプリケーションはキャンセル要求を処理し、他の作業を続行できる必要があります。 COMでは、IMessageFilterインターフェイスを使用して、シングルスレッドアパートメントから発生する保留中の呼び出しをキャンセルできます。

呼び出しがマーシャリングされると、プロキシはICancelMethodCallsインターフェイスを実装するキャンセルオブジェクトを作成します。 キャンセルオブジェクトは、呼び出しと、呼び出しが保留されているスレッドの両方に関連付けられています。

保留中の呼び出しを取り消すには、クライアントはキャンセルオブジェクトを使用して取り消し要求を渡します。このオブジェクトは、呼び出しが取り消されたことをサーバーオブジェクトに通知する詳細を処理します。 呼び出されたメソッドがまだ返されていない場合、サーバーオブジェクトはキャンセル要求を検出した際に、割り当てたプログラムリソースをクリーンアップし、適切なHRESULT値を返して、呼び出しの実行をキャンセルしたことをクライアントに通知します。 呼び出されたメソッドが既に返されている場合、キャンセルオブジェクトはクライアントに通知します。 どちらの場合も、クライアントスレッドのブロックが解除され、処理を続行できます。

サーバーオブジェクトがキャンセル要求に応答する方法は、サーバーの実装者の裁量によって異なりますが、クライアント上の呼び出し元のスレッドは常にブロック解除され、サーバーが渡そうとした結果は無視されます。 Cancelオブジェクトは、現在実行中のメソッドのキャンセルを要求する手段を提供しますが、サーバーオブジェクトが呼び出しの処理を停止する保証はありません。 たとえば、呼び出しが既に返されている場合や、サーバーオブジェクトがキャンセルオブジェクトをサポートしていない場合があります。

COMでは、標準マーシャリングを使用するクライアントオブジェクトおよびインターフェイスに対して、キャンセルオブジェクトの標準実装が自動的に提供されます。 カスタムマーシャリングを使用するオブジェクトとインターフェイスの場合は、独自のキャンセルオブジェクトを実装する必要があります。

現時点では、キャンセルオブジェクトは同期呼び出しのみを処理します。

非同期呼び出しの取り消し

CoGetCancelObject

CoSetCancelObject

CoTestCancel