Создание и обработка асинхронных вызовов

COM-объекты могут поддерживать асинхронный вызов. Когда клиент выполняет асинхронный вызов, управление немедленно возвращается клиенту. Пока сервер обрабатывает вызов, клиент может выполнять другие действия. Если клиент больше не может продолжать работу без результатов вызова, он может получить результаты вызова в это время.

Например, запрос на большой или сложный набор записей может занять много времени. Клиент может запросить набор записей с помощью асинхронного вызова, а затем выполнить другие действия. Если набор записей доступен, клиент может быстро получить его без блокировки.

Клиенты не выполняют асинхронные вызовы непосредственно на серверный объект. Вместо этого они получают объект вызова, который реализует асинхронную версию синхронного интерфейса для серверного объекта. Асинхронный интерфейс для объекта вызова имеет имя в виде асинхронного interfacename. Например, если объект сервера реализует синхронный интерфейс с именем IMyInterface, то будет существовать объект call, реализующий асинхронный интерфейс с именем АсинЦиминтерфаце.

Примечание

Асинхронная поддержка недоступна для IDispatch или для интерфейсов, которые наследуют IDispatch.

Объекты сервера, поддерживающие асинхронные вызовы, реализуют интерфейс икаллфактори . Этот интерфейс предоставляет единственный метод креатекалл, который создает экземпляр указанного объекта вызова. Клиенты могут запрашивать икаллфактори , чтобы определить, поддерживает ли объект асинхронный вызов.

Для каждого метода в синхронном интерфейсе соответствующий асинхронный интерфейс реализует два метода. Эти методы присоединяют префиксы Begin _ и Finish _ к имени синхронного метода. Например, если интерфейс с именем Исимплестреам имеет метод Read, то интерфейс АсинЦисимплестреам будет иметь _ метод Begin Read и готово _ Read. Чтобы начать асинхронный вызов, клиент вызывает _ метод Begin.

При реализации серверного объекта нет необходимости предоставлять объект вызова для каждого интерфейса, реализуемого объектом. Если серверный объект реализует интерфейс икаллфактори и использует стандартную упаковку, то упакованный клиент всегда может получить объект вызова прокси-сервера, даже если на стороне сервера нет объекта Call. Этот прокси-сервер маршалирует _ метод Begin как синхронный вызов, сервер будет обрабатывать вызов синхронно, а клиент может получить выходные параметры, вызвав _ метод Finish.

И наоборот, если клиент выполняет упакованный синхронный вызов в интерфейсе, для которого имеется объект вызова на стороне сервера, сервер всегда будет обрабатывать вызов асинхронно. Это поведение не будет очевидным для клиента, так как клиент будет получать те же выходные параметры и то же возвращаемое значение, что было бы получено от синхронного метода.

В любом случае взаимодействие между клиентом и сервером маршалируется, как если бы вызов был синхронным: выходные данные синхронных и асинхронных прокси-серверов неразличимы, как и выходные данные соответствующих заглушек. Такое поведение значительно упрощает модель программирования как клиентов, так и серверов. Если серверный объект реализует икаллфактори, упакованному клиенту не нужно пытаться создать объект вызова, который может быть недоступен клиенту, объект вызова всегда доступен.

Если клиент и сервер находятся в одном апартаменте, объект сервера будет обрабатывать любой вызов, который делает клиент. Если объект вызова недоступен, клиент должен явно получить синхронный интерфейс и выполнить синхронный вызов.

Дополнительные сведения см. в следующих разделах: