Почему мой .NET Windows сервис иногда не запускается автоматически? - PullRequest
3 голосов
/ 08 марта 2010

Я изменил работающую службу Windows, которая всегда запускалась заранее. После добавления ссылки System.Management она теперь иногда не запускается автоматически. Я получаю следующую ошибку:

Служба не может быть запущена. System.Runtime.InteropServices.COMException (0x80010002): вызов был отменен фильтр сообщений. (Исключение из HRESULT: 0x80010002 (RPC_E_CALL_CANCELED))

Я нашел другой пост здесь на SO с кем-то, имеющим ту же проблему

Почему моя служба .Net Windows не запускается автоматически после перезагрузки?

Однако предлагаемое решение состояло в том, чтобы запускать службу после запуска служб, от которых она зависит. Однако, когда я перехожу на вкладку Зависимости для моего сервиса, я вижу:

alt text

Должен ли я просто использовать обходной метод перевода потока в спящий режим или есть более правильный способ заставить этот сервис запускаться правильно? Это происходит потому, что .NET не запустился до запуска моей службы?

Спасибо

Томек

EDIT: я добавил оператор try-catch, чтобы перехватить исключение. Вот код, который я добавил к методу OnStart () моего сервиса (именно там создается исключение)

        try
        {
            _watcher = new ManagementEventWatcher(query);
            _watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
            _watcher.Start();  
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("Could not create Sleep/Resume watcher" + ex.Message);
        }

Служба запускается сейчас, но без добавленной мной функциональности. Я новичок в .NET, но я взял код наблюдателя из примера, который нашел в Интернете, поэтому я уверен, что он правильный. Журнал событий отображает то же исключение:

Не удалось создать наблюдателя режима ожидания / сна. Фильтр сообщений отменил вызов. (Исключение из HRESULT: 0x80010002 (RPC_E_CALL_CANCELED))

Ответы [ 4 ]

8 голосов
/ 19 ноября 2012

Я сам столкнулся с этой проблемой и, по-видимому, она возникает только в Windows XP (не в Vista или Win 7). Чтобы это исправить, нужно добавить зависимость в службу инструментария управления Windows. Добавление этой зависимости к существующей службе выполняется в три простых шага:

  1. Открыть командную строку (Windows + R -> cmd -> enter)
  2. Тип: sc config "NAME_OF_YOUR_SERVICE" зависимость = winmgmt
  3. Нажмите ввод, вы должны увидеть: [SC] ChangeServiceConfig SUCCESS

Перезагрузите компьютер, и теперь ваша служба должна запускаться правильно.

1 голос
/ 08 марта 2010

Проблема не в самой службе, а в том, что новый компонент, на который вы добавили ссылку, генерирует необработанное исключение (вызов был отменен фильтром сообщений). Устраните это сообщение об ошибке с любым кодом, который вы добавили, и / или добавьте лучшую обработку ошибок, чтобы ошибка в этом компоненте не всплывала наверх и не приводила к остановке службы: -)

0 голосов
/ 09 марта 2010

В итоге я использовал Thread.Sleep (10000) непосредственно перед созданием ManagementEventWatcher (перед оператором try)

Это своего рода обходной путь, но он решил проблему.

0 голосов
/ 09 марта 2010

Если вы зависите от другой службы, используйте sc.exe, чтобы настроить службу для запуска после зависимости. Это невозможно сделать с помощью апплета Services.

...