다음을 통해 공유


비동기 호출 만들기

동기 호출을 위한 절차는 간단합니다. 클라이언트는 서버 개체에 대한 인터페이스 포인터를 가져오고 해당 포인터를 통해 메서드를 호출합니다. 비동기 호출에는 호출 개체가 포함되므로 몇 가지 단계가 더 필요합니다.

동기 인터페이스의 각 메서드에 대해 해당 비동기 인터페이스는 두 가지 메서드를 구현합니다. 이러한 메서드는 접두사 Begin_ 연결하고 동기 메서드의 이름에 Finish_. 예를 들어 ISimpleStream이라는 인터페이스에 Read 메서드가 있는 경우 AsyncISimpleStream 인터페이스에는 Begin_Read 및 Finish_Read 메서드가 있습니다. 비동기 호출을 시작하려면 클라이언트는 Begin_ 메서드를 호출합니다.

비동기 호출을 시작하려면

  1. ICallFactory 인터페이스에 대한 서버 개체를 쿼리합니다. QueryInterface가 E_NOINTERFACE 반환하는 경우 서버 개체는 비동기 호출을 지원하지 않습니다.

  2. ICallFactory::CreateCall을 호출하여 원하는 인터페이스에 해당하는 호출 개체를 만든 다음 ICallFactory에 대한 포인터를 해제합니다.

  3. CreateCall 호출에서 비동기 인터페이스에 대한 포인터를 요청하지 않은 경우 비동기 인터페이스에 대한 호출 개체를 쿼리합니다.

  4. 적절한 Begin_ 메서드를 호출합니다.

이제 서버 개체가 비동기 호출을 처리하고 있으며 클라이언트는 호출 결과가 필요할 때까지 다른 작업을 자유롭게 수행할 수 있습니다.

호출 개체는 한 번에 하나의 비동기 호출만 처리할 수 있습니다. 보류 중인 비동기 호출이 완료되기 전에 동일하거나 두 번째 클라이언트가 Begin_ 메서드를 호출하는 경우 Begin_ 메서드는 RPC_E_CALL_PENDING 반환합니다.

클라이언트가 Begin_ 메서드의 결과가 필요하지 않은 경우 이 절차의 끝에 호출 개체를 해제할 수 있습니다. COM은 이 조건을 검색하고 호출을 정리합니다. Finish_ 메서드는 호출되지 않으며 클라이언트는 매개 변수 또는 반환 값을 얻지 못합니다.

서버 개체가 Begin_ 메서드에서 반환할 준비가 되면 호출 개체가 완료되었음을 알려줍니다. 클라이언트가 준비되면 호출 개체에 신호가 전송되었는지 여부를 확인합니다. 이 경우 클라이언트는 비동기 호출을 완료할 수 있습니다.

클라이언트와 서버 간의 이 신호 및 확인 메커니즘은 호출 개체의 ISynchronize 인터페이스입니다. 호출 개체는 일반적으로 시스템에서 제공하는 동기화 개체를 집계하여 이 인터페이스를 구현합니다. 동기화 개체는 ISynchronize::Signal을 호출하여 Begin_ 메서드에서 반환하기 직전에 서버가 신호를 전송하는 이벤트 핸들을 래핑합니다.

비동기 호출을 완료하려면

  1. ISynchronize 인터페이스에 대한 호출 개체를 쿼리합니다.

  2. ISynchronize::Wait를 호출합니다.

  3. Wait가 RPC_E_TIMEOUT 반환하면 Begin_ 메서드가 처리가 완료되지 않습니다. 클라이언트는 다른 작업을 계속하고 나중에 다시 대기 를 호출할 수 있습니다. Wait가 S_OK 반환할 때까지 Finish_ 메서드 호출할 수 없습니다.

    Wait가 S_OK 반환하면 Begin_ 메서드가 반환됩니다. 적절한 Finish_ 메서드를 호출합니다.

Finish_ 메서드는 클라이언트에 모든 매개 변수를 전달합니다. Finish_ 메서드의 반환 값을 포함하여 비동기 메서드의 동작은 해당 동기 메서드의 동작과 정확히 일치해야 합니다.

클라이언트는 Finish_ 메서드가 반환되는 즉시 호출 개체를 해제하거나 호출 개체에 대한 포인터를 보유하여 추가 호출을 수행할 수 있습니다. 두 경우 모두 클라이언트는 개체가 더 이상 필요하지 않을 때 호출 개체를 해제할 책임이 있습니다.

호출이 진행 중이 아니면 Finish_ 메서드를 호출하면 메서드가 RPC_E_CALL_COMPLETE 반환됩니다.

참고

클라이언트 및 서버 개체가 동일한 아파트에 있는 경우 ICallFactory::CreateCall 에 대한 호출이 성공하도록 보장되지 않습니다. 서버 개체가 특정 인터페이스에서 비동기 호출을 지원하지 않는 경우 호출 개체를 만들려는 시도가 실패하고 클라이언트가 동기 인터페이스를 사용해야 합니다.

 

비동기 호출 취소

비동기 호출 중 클라이언트 보안

가장 및 비동기 호출