Partilhar via


Fazendo uma chamada assíncrona

O procedimento para fazer uma chamada síncrona é simples: o cliente obtém um ponteiro de interface no objeto do servidor e chama métodos por meio desse ponteiro. A chamada assíncrona envolve um objeto de chamada, portanto, envolve mais algumas etapas.

Para cada método em uma interface síncrona, a interface assíncrona correspondente implementa dois métodos. Esses métodos anexam os prefixos Begin_ e Finish_ ao nome do método síncrono. Por exemplo, se uma interface chamada ISimpleStream tiver um método Read, a interface AsyncISimpleStream terá um Begin_Read e um método Finish_Read. Para iniciar uma chamada assíncrona, o cliente chama o método Begin_.

Para iniciar uma chamada assíncrona

  1. Consulte o objeto de servidor para a interface ICallFactory. Se QueryInterface retornar E_NOINTERFACE, o objeto de servidor não oferece suporte a chamadas assíncronas.

  2. Chame ICallFactory::CreateCall para criar um objeto de chamada correspondente à interface desejada e, em seguida, solte o ponteiro para ICallFactory.

  3. Se não tiver solicitado um ponteiro para a interface assíncrona a partir da chamada para CreateCall, consulte o objeto de chamada para a interface assíncrona.

  4. Chame o método Begin_ apropriado.

O objeto do servidor agora está processando a chamada assíncrona e o cliente está livre para fazer outro trabalho até precisar dos resultados da chamada.

Um objeto de chamada pode processar apenas uma chamada assíncrona de cada vez. Se o mesmo ou um segundo cliente chamar um método Begin_ antes que uma chamada assíncrona pendente seja concluída, o método Begin_ retornará RPC_E_CALL_PENDING.

Se o cliente não precisar dos resultados do método Begin_, ele pode liberar o objeto de chamada no final deste procedimento. O COM deteta essa condição e limpa a chamada. O método Finish_ não é chamado e o cliente não obtém nenhum parâmetro de saída ou um valor de retorno.

Quando o objeto de servidor está pronto para retornar do método Begin_, ele sinaliza ao objeto de chamada que ele está pronto. Quando o cliente está pronto, ele verifica se o objeto de chamada foi sinalizado. Em caso afirmativo, o cliente pode concluir a chamada assíncrona.

O mecanismo para essa sinalização e verificação entre cliente e servidor é o ISynchronize interface no objeto de chamada. O objeto call normalmente implementa essa interface agregando um objeto de sincronização fornecido pelo sistema. O objeto de sincronização encapsula um identificador de evento, que o servidor sinaliza pouco antes de retornar do método Begin_ chamando ISynchronize::Signal.

Para concluir uma chamada assíncrona

  1. Consulte o objeto de chamada para a interface ISynchronize.

  2. Ligue ISynchronize::Aguarde.

  3. Se Wait retornar RPC_E_TIMEOUT, o método Begin_ não está concluído no processamento. O cliente pode continuar com outros trabalhos e ligar para Aguarde novamente mais tarde. Ele não pode chamar o método Finish_ até que Wait retorne S_OK.

    Se Wait retornar S_OK, o método Begin_ terá retornado. Chame o método Finish_ apropriado.

O método Finish_ fornece ao cliente quaisquer parâmetros de saída. O comportamento dos métodos assíncronos, incluindo o valor de retorno do método Finish_, deve corresponder exatamente ao do método síncrono correspondente.

O cliente pode liberar o objeto de chamada assim que o método Finish_ retorna, ou pode manter um ponteiro para o objeto de chamada para fazer chamadas adicionais. Em ambos os casos, o cliente é responsável por liberar o objeto de chamada quando o objeto não é mais necessário.

Se você chamar um método Finish_ quando nenhuma chamada estiver em andamento, o método retornará RPC_E_CALL_COMPLETE.

Observação

Se os objetos cliente e servidor estiverem no mesmo apartamento, não é garantido que as chamadas para ICallFactory::CreateCall tenham êxito. Se o objeto de servidor não oferecer suporte a chamadas assíncronas em uma interface específica, a tentativa de criar um objeto de chamada falhará e o cliente deverá usar a interface síncrona.

 

Cancelar uma chamada assíncrona

segurança do cliente durante uma chamada assíncrona

Falsificação e chamadas assíncronas