обнаружение завершения клиентского процесса с EXE COM-сервера - PullRequest
2 голосов
/ 26 июня 2009

Я пишу EXE COM-сервер, который предоставляет класс, который блокирует системный ресурс. При обычном выполнении клиент освобождает ресурс (исполняемый файл COM отключается через пару секунд. При ненормальном выполнении клиентское приложение падает, оставляя сервер с экземпляром, имеющим положительный счетчик ссылок. Исполняемый файл COM работает в течение ~ 12 минут до завершения. Это означает, что системный ресурс заблокирован в течение этого времени.

Есть ли способ мгновенного обнаружения завершения клиента, как в IPC сокете или протоколе драйвера? в противном случае может показаться, что COM уступает другим механизмам IPC.

1 Ответ

1 голос
/ 03 октября 2010

У меня был тот же вопрос пару лет назад. Я нашел ответ здесь: Как отключить механизм сбора мусора COM . Короче говоря: нет, нет способа мгновенно обнаружить завершение клиента. Выдержки:

Когда COM-клиент завершает свою работу нормально, он выпускает все ссылки на его объект сервера. Когда клиент заканчивается ненормально, однако, там может быть выдающиеся ссылки на объект сервера. Без мусора механизм сбора, код сервера не может знать, когда вернуть ресурсы, выделенные для СОМ объект, который затем может вызвать утечка ресурсов. Для решения этой проблемы проблема, COM реализует автоматический механизм сбора мусора, в котором процесс распознавания COM (RPCSS) на клиентская машина пингует сервер машина от имени клиента процесс.

Альтернативы использованию COM GC протокол (например, с использованием периодического "пинг" уровня приложения - метод звонки, которые сообщают объекту, что клиенты все еще живы или используют основной транспортный механизм, такой как TCP keepalive) явно много менее эффективны. Следовательно, DCOM должен использоваться механизм GC по умолчанию для любых объектов, которые должны быть закрыты когда их клиенты исчезают или в противном случае плохо себя вести, если эти объекты будет эффективно утечки памяти на сервере.

распознаватель на сервере отслеживает пинг для каждого объект сервера. Период пинга 2 минут и, в настоящее время, это не настраивается. Когда решатель на серверный компьютер обнаруживает, что объект не пинговал 6 минут, это предполагает, что все клиенты объекта прекратились или нет дольше используя объект. Решатель затем выпустит все внешние ссылки на объект. Это делает это просто имея заглушку объекта менеджер (код выполнения COM, который доставляет звонки на каждый объект) вызов :: Release () для объекта IUnknown интерфейс. На данный момент объект отсчет будет равен нулю, поскольку время выполнения COM касается. (Там все еще могут быть ссылки, проводимые местными (однокомнатные) клиенты, так что Счетчик внутренних ссылок объекта может не обязательно идти в ноль в этом точка.) Объект может затем закрыть сам вниз.

ПРИМЕЧАНИЕ. Сборка мусора относится к все серверы независимо от того, их клиенты являются локальными или удаленными, или сочетание локального и удаленного. лежащий в основе механизм пингования отличается в местном случае, как нет сетевые пакеты генерируются, но для все практические цели, поведение такой же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...