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

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

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

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

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

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

alt text

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

Спасибо,

Томек

РЕДАКТИРОВАТЬ: я добавил оператор 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))


person Tomek    schedule 08.03.2010    source источник
comment
Вы также можете попробовать разместить свой вопрос на ServerFault.com.   -  person DOK    schedule 08.03.2010
comment
Поскольку теперь вы используете WMI, вам, вероятно, следует дождаться запуска службы инструментария управления Windows. Попробуйте добавить его в зависимые службы во время установки.   -  person S.Skov    schedule 09.03.2010


Ответы (4)


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

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

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

person Jonathan Persson    schedule 19.11.2012
comment
Это правильный ответ! Вы также можете добавить зависимость в установщик службы. - person Andre Hofmeister; 26.08.2013

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

person Joel Martinez    schedule 08.03.2010
comment
@Joel Martinez Я добавил пробную ловушку, но получаю то же исключение (см. Мою правку) - person Tomek; 09.03.2010

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

person Timores    schedule 08.03.2010
comment
как я могу узнать, от каких служб зависит моя служба, кроме апплета служб? - person Tomek; 09.03.2010

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

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

person Tomek    schedule 08.03.2010