Cancelando chamadas de método

Com a introdução de aplicativos distribuídos e baseados na Web, algumas chamadas de método podem levar um tempo inaceitavelmente longo para retornar. A latência da conexão de rede pode ser alta, a máquina do servidor pode estar atendendo a muitos clientes ou o componente do servidor pode estar passando uma grande quantidade de dados, como um arquivo multimídia. Os usuários devem ser capazes de cancelar uma solicitação que está demorando muito, e o aplicativo deve ser capaz de lidar com solicitações de cancelamento e continuar com seu outro trabalho. Em COM, você pode usar a interface IMessageFilter para cancelar uma chamada pendente originada de um apartamento de thread único.

Quando uma chamada é empacotada, o proxy cria um objeto cancel, que implementa a interface ICancelMethodCalls. O objeto cancel está associado à chamada e ao thread no qual a chamada está pendente.

Para cancelar a chamada pendente, o cliente passa uma solicitação de cancelamento pelo objeto cancel, que manipula os detalhes de notificar o objeto do servidor de que a chamada foi cancelada. Se o método chamado não tiver retornado, o objeto do servidor, ao detectar a solicitação de cancelamento, limpará todos os recursos do programa alocados e notificará seu cliente, retornando um valor HRESULT apropriado, de que cancelou a execução da chamada. Se o método chamado já tiver retornado, o objeto cancel notificará o cliente. Em ambos os casos, o thread do cliente é desbloqueado e pode continuar o processamento.

A forma como o objeto de servidor responde a uma solicitação de cancelamento fica a critério do implementador do servidor, mas o thread de chamada no cliente sempre será desbloqueado e ignorará quaisquer resultados que o servidor tente passar para ele. Os objetos Cancel fornecem um meio de solicitar que um método em execução no momento seja cancelado, mas não há garantia de que o objeto do servidor interromperá o processamento da chamada. Por exemplo, a chamada pode já ter retornado ou o objeto de servidor pode não oferecer suporte a objetos de cancelamento.

COM fornece automaticamente uma implementação padrão de cancelar objetos para objetos cliente e interfaces que usam marshaling padrão. Para objetos e interfaces que usam empacotamento personalizado, você precisará implementar seu próprio objeto cancelar.

Neste momento, cancelar objetos manipulam apenas chamadas síncronas.

Cancelando uma chamada assíncrona

CoGetCancelObject

CoSetCancelObject

CoTestCancel