비동기 호출 만들기
동기 호출을 위한 절차는 간단합니다. 클라이언트는 서버 개체에 대한 인터페이스 포인터를 가져오고 해당 포인터를 통해 메서드를 호출합니다. 비동기 호출에는 호출 개체가 포함되므로 몇 가지 단계가 더 필요합니다.
동기 인터페이스의 각 메서드에 대해 해당 비동기 인터페이스는 두 가지 메서드를 구현합니다. 이러한 메서드는 접두사 Begin_ 연결하고 동기 메서드의 이름에 Finish_. 예를 들어 ISimpleStream이라는 인터페이스에 Read 메서드가 있는 경우 AsyncISimpleStream 인터페이스에는 Begin_Read 및 Finish_Read 메서드가 있습니다. 비동기 호출을 시작하려면 클라이언트는 Begin_ 메서드를 호출합니다.
비동기 호출을 시작하려면
ICallFactory 인터페이스에 대한 서버 개체를 쿼리합니다. QueryInterface가 E_NOINTERFACE 반환하는 경우 서버 개체는 비동기 호출을 지원하지 않습니다.
ICallFactory::CreateCall을 호출하여 원하는 인터페이스에 해당하는 호출 개체를 만든 다음 ICallFactory에 대한 포인터를 해제합니다.
CreateCall 호출에서 비동기 인터페이스에 대한 포인터를 요청하지 않은 경우 비동기 인터페이스에 대한 호출 개체를 쿼리합니다.
적절한 Begin_ 메서드를 호출합니다.
이제 서버 개체가 비동기 호출을 처리하고 있으며 클라이언트는 호출 결과가 필요할 때까지 다른 작업을 자유롭게 수행할 수 있습니다.
호출 개체는 한 번에 하나의 비동기 호출만 처리할 수 있습니다. 보류 중인 비동기 호출이 완료되기 전에 동일하거나 두 번째 클라이언트가 Begin_ 메서드를 호출하는 경우 Begin_ 메서드는 RPC_E_CALL_PENDING 반환합니다.
클라이언트가 Begin_ 메서드의 결과가 필요하지 않은 경우 이 절차의 끝에 호출 개체를 해제할 수 있습니다. COM은 이 조건을 검색하고 호출을 정리합니다. Finish_ 메서드는 호출되지 않으며 클라이언트는 매개 변수 또는 반환 값을 얻지 못합니다.
서버 개체가 Begin_ 메서드에서 반환할 준비가 되면 호출 개체가 완료되었음을 알려줍니다. 클라이언트가 준비되면 호출 개체에 신호가 전송되었는지 여부를 확인합니다. 이 경우 클라이언트는 비동기 호출을 완료할 수 있습니다.
클라이언트와 서버 간의 이 신호 및 확인 메커니즘은 호출 개체의 ISynchronize 인터페이스입니다. 호출 개체는 일반적으로 시스템에서 제공하는 동기화 개체를 집계하여 이 인터페이스를 구현합니다. 동기화 개체는 ISynchronize::Signal을 호출하여 Begin_ 메서드에서 반환하기 직전에 서버가 신호를 전송하는 이벤트 핸들을 래핑합니다.
비동기 호출을 완료하려면
ISynchronize 인터페이스에 대한 호출 개체를 쿼리합니다.
Wait가 RPC_E_TIMEOUT 반환하면 Begin_ 메서드가 처리가 완료되지 않습니다. 클라이언트는 다른 작업을 계속하고 나중에 다시 대기 를 호출할 수 있습니다. Wait가 S_OK 반환할 때까지 Finish_ 메서드 를 호출할 수 없습니다.
Wait가 S_OK 반환하면 Begin_ 메서드가 반환됩니다. 적절한 Finish_ 메서드를 호출합니다.
Finish_ 메서드는 클라이언트에 모든 매개 변수를 전달합니다. Finish_ 메서드의 반환 값을 포함하여 비동기 메서드의 동작은 해당 동기 메서드의 동작과 정확히 일치해야 합니다.
클라이언트는 Finish_ 메서드가 반환되는 즉시 호출 개체를 해제하거나 호출 개체에 대한 포인터를 보유하여 추가 호출을 수행할 수 있습니다. 두 경우 모두 클라이언트는 개체가 더 이상 필요하지 않을 때 호출 개체를 해제할 책임이 있습니다.
호출이 진행 중이 아니면 Finish_ 메서드를 호출하면 메서드가 RPC_E_CALL_COMPLETE 반환됩니다.
참고
클라이언트 및 서버 개체가 동일한 아파트에 있는 경우 ICallFactory::CreateCall 에 대한 호출이 성공하도록 보장되지 않습니다. 서버 개체가 특정 인터페이스에서 비동기 호출을 지원하지 않는 경우 호출 개체를 만들려는 시도가 실패하고 클라이언트가 동기 인터페이스를 사용해야 합니다.
관련 항목