Cancelando uma chamada assíncrona

Um cliente pode cancelar uma chamada assíncrona que está em andamento se o objeto de chamada implementa a interface ICancelMethodCalls. Para objetos que usam empacotamento padrão, ICancelMethodCalls está sempre disponível para chamadas empacotadas. Para objetos que usam empacotamento personalizado ou para chamadas para objetos de servidor dentro do mesmo apartamento, essa funcionalidade estará disponível somente se o objeto de chamada implementar ICancelMethodCalls.

O cliente pode cancelar a chamada a qualquer momento, desde quando o método Begin_ é chamado até que o método Finish_ retorne. Se o cliente cancelar a chamada antes de chamar o método Finish_, ele deverá chamar o método Finish_ para limpar o estado do objeto de chamada. Até que o cliente tenha feito isso, todas as chamadas para qualquer método Begin_ no objeto de chamada retornarão RPC_E_CALL_PENDING.

Para cancelar uma chamada assíncrona

  1. Consulte o objeto de chamada para ICancelMethodCalls.

  2. Chame ICancelMethodCalls::Cancel e, em seguida, chame Release para liberar o ponteiro obtido pela chamada QueryInterface na etapa 1.

  3. Se o cliente ainda não chamou o método Finish_, chame-o agora.

Não há garantia de que o servidor realmente interrompeu a execução da chamada. Se o trabalho adicional do cliente depender de algum estado do servidor que a chamada pode ou não ter sido alterada, o cliente deve determinar esse estado antes de continuar.

Fazendo uma chamada assíncrona