Compartir a través de


Cancelación de llamadas de método

Con la introducción de aplicaciones distribuidas y basadas en web, algunas llamadas de método pueden tardar mucho tiempo en devolverse. La latencia de la conexión de red puede ser alta, la máquina del servidor puede servir a muchos clientes o el componente de servidor puede pasar una gran cantidad de datos, como un archivo multimedia. Los usuarios deben poder cancelar una solicitud que tarda demasiado tiempo, y la aplicación debe ser capaz de controlar las solicitudes de cancelación y continuar con su otro trabajo. En COM, puede usar la interfaz IMessageFilter para cancelar una llamada pendiente que se origina en un contenedor de un solo subproceso.

Cuando se serializa una llamada, el proxy crea un objeto cancel, que implementa la interfaz ICancelMethodCalls . El objeto cancel está asociado a la llamada y al subproceso en el que la llamada está pendiente.

Para cancelar la llamada pendiente, el cliente pasa una solicitud de cancelación a través del objeto cancel, que controla los detalles de notificar al objeto de servidor que se ha cancelado la llamada. Si el método llamado no ha devuelto, el objeto de servidor, al detectar la solicitud de cancelación, limpia los recursos del programa que ha asignado y notifica a su cliente, devolviendo un valor HRESULT adecuado, que canceló la ejecución de la llamada. Si el método llamado ya se ha devuelto, el objeto cancel notifica al cliente. En cualquier caso, el subproceso de cliente se desbloquea y puede continuar procesando.

La forma en que el objeto de servidor responde a una solicitud de cancelación es a discreción del implementador del servidor, pero el subproceso que realiza la llamada en el cliente siempre se desbloqueará y omitirá los resultados que el servidor intente pasar a él. Cancelar objetos proporciona un medio para solicitar que se cancele un método que se está ejecutando actualmente, pero no hay ninguna garantía de que el objeto de servidor deje de procesar la llamada. Por ejemplo, es posible que la llamada ya se haya devuelto o que el objeto de servidor no admita objetos cancel.

COM proporciona automáticamente una implementación estándar de objetos cancel para objetos de cliente e interfaces que usan serialización estándar. En el caso de objetos e interfaces que usan serialización personalizada, deberá implementar su propio objeto cancel.

En este momento, los objetos cancel solo controlan las llamadas sincrónicas.

Cancelación de una llamada asincrónica

CoGetCancelObject

CoSetCancelObject

CoTestCancel