Отмена асинхронного вызова

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

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

Отмена асинхронного вызова

  1. Запросите объект вызова для ICancelMethodCalls.

  2. Вызовите ICancelMethodCalls::Cancel, а затем вызовите release, чтобы освободить указатель, полученный вызовом QueryInterface на шаге 1.

  3. Если клиент еще не вызвал метод Finish_, вызовите его сейчас.

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

Выполнение асинхронного вызова