У меня есть собственная служба Visual C ++ NT. Когда служба запускается, ее поток вызывает CoInitialize()
, который присоединяет поток к STA - поток службы использует MSXML через интерфейсы COM.
Когда служба получает SERVICE_CONTROL_STOP
, она отправляет сообщение в очередь сообщений, затем позднее это сообщение извлекается и вызывается обработчик OnStop()
. Обработчик убирает вещи и вызывает CoUnitialize()
. Большую часть времени он работает нормально, но время от времени последний звонок зависает. Я не могу воспроизвести это поведение стабильно.
Я немного погуглил и нашел следующие вероятные объяснения:
- не удалось освободить все принадлежащие COM-объекты
- многократный вызов
CoInitializeEx()
/ CoUnitialize()
для подключения к MTA
- не удается отправить сообщение в потоках STA
Первый вариант маловероятен - код, использующий MSXML, хорошо протестирован и проанализирован, и в нем используются интеллектуальные указатели для управления временем жизни объектов, поэтому утечка объектов в действительности маловероятна.
Второй не выглядит вероятной причиной. Я присоединяюсь к STA и больше не вызываю эти функции.
Третий выглядит более или менее вероятным. Пока поток обрабатывает сообщение, он больше не запускает цикл сообщений - он уже внутри цикла. Я полагаю, это может быть причиной.
Является ли последняя вероятной причиной этой проблемы? Какие еще причины я должен рассмотреть? Как мне легко решить эту проблему?