Поделиться через


Отмена вызовов метода

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

При маршалировании вызова прокси-сервер создает объект отмены, который реализует интерфейс ICancelMethodCalls. Объект отмены связан как с вызовом, так и с потоком, в котором ожидается вызов.

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

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

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

В настоящее время отмена объектов обрабатывает только синхронные вызовы.

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

CoGetCancelObject

CoSetCancelObject

CoTestCancel