비동기 호출 만들기 및 처리

COM 개체는 비동기 호출을 지원할 수 있습니다. 클라이언트가 비동기 호출을 하면 컨트롤이 클라이언트에 즉시 반환됩니다. 서버가 호출을 처리하는 동안 클라이언트는 다른 작업을 자유롭게 수행할 수 있습니다. 클라이언트가 호출 결과 없이 더 이상 진행할 수 없는 경우 해당 시간에 호출 결과를 가져올 수 있습니다.

예를 들어 크거나 복잡한 레코드 집합에 대한 요청은 시간이 오래 걸릴 수 있습니다. 클라이언트는 비동기 호출을 통해 레코드 집합을 요청한 다음 다른 작업을 수행할 수 있습니다. 레코드 집합을 사용할 수 있는 경우 클라이언트는 차단 없이 빠르게 가져올 수 있습니다.

클라이언트는 서버 개체에서 직접 비동기 호출을 수행하지 않습니다. 대신 서버 개체에서 동기 인터페이스의 비동기 버전을 구현하는 호출 개체를 가져옵니다. 호출 개체의 비동기 인터페이스에는 AsyncInterfaceName 형식의 이름이 있습니다. 예를 들어 서버 개체가 IMyInterface라는 동기 인터페이스를 구현하는 경우 AsyncIMyInterface라는 비동기 인터페이스를 구현하는 호출 개체가 있습니다.

참고

IDispatch 또는 IDispatch를 상속하는 인터페이스에는 비동기 지원을 사용할 수 없습니다.

 

비동기 호출을 지원하는 서버 개체는 ICallFactory 인터페이스를 구현합니다. 이 인터페이스는 지정된 호출 개체의 instance 만드는 단일 메서드 CreateCall을 노출합니다. 클라이언트는 ICallFactory 를 쿼리하여 개체가 비동기 호출을 지원하는지 여부를 확인할 수 있습니다.

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

서버 개체를 구현할 때 개체가 구현하는 모든 인터페이스에 대한 호출 개체를 제공할 필요는 없습니다. 서버 개체가 ICallFactory 인터페이스를 구현하고 표준 마샬링을 사용하는 경우 마샬링된 클라이언트는 서버 쪽에 호출 개체가 없더라도 항상 프록시 호출 개체를 가져올 수 있습니다. 이 프록시는 Begin_ 메서드를 동기 호출로 마샬링하고, 서버에서 호출을 동기적으로 처리하며, 클라이언트는 Finish_ 메서드를 호출하여 out 매개 변수를 가져올 수 있습니다.

반대로 클라이언트가 서버 쪽에 호출 개체가 있는 인터페이스에서 마샬링된 동기 호출을 수행하면 서버는 항상 호출을 비동기적으로 처리합니다. 클라이언트가 동기 메서드에서 받은 것과 동일한 출력 매개 변수와 동일한 반환 값을 받기 때문에 이 동작은 클라이언트에 명확하지 않습니다.

두 경우 모두 클라이언트와 서버 간의 상호 작용은 호출이 동기인 것처럼 마샬링됩니다. 동기 및 비동기 프록시의 출력은 해당 스텁의 출력과 구별할 수 없습니다. 이 동작은 클라이언트와 서버 모두의 프로그래밍 모델을 크게 간소화합니다. 서버 개체가 ICallFactory를 구현하는 경우 마샬링된 클라이언트는 사용할 수 없는 호출 개체를 만들려고 시도할 필요가 없습니다. 클라이언트에 대한 호출 개체는 항상 사용할 수 있습니다.

클라이언트와 서버가 동일한 아파트에 있는 경우 서버 개체는 클라이언트가 만드는 호출을 처리합니다. 호출 개체를 사용할 수 없는 경우 클라이언트는 명시적으로 동기 인터페이스를 가져오고 동기 호출을 수행해야 합니다.

자세한 내용은 아래 항목을 참조하세요.