Я унаследовал службу Windows, написанную на С#. В редких случаях это терпит неудачу. Тем не менее, совсем не ясно, как неудачно пройти. Росс Беннетт излагает проблему элегантно на bytes.com. Для простоты я просто приведу его здесь.
Ахой, народ!
Я искал все это, но я просто не могу пошатнуть документацию из MSDN или из Google. Я просмотрел каждый .NET. статья о разработке служб Windows в MSDN, который я нашел.
Я разрабатываю службу Windows выражение. Эта служба читает данные конфигурации из системы реестра (HKLM), где он был депонирован другим "менеджером". нет проблемы там.
Служба использует рабочий поток для выполнения это работает. Нить создается в OnStart() и сигнализация/соединение/расположение в OnStop(). Опять же, никаких проблем.
Все работает красиво, когда:
- Системный администратор настроил все правильно и
- Доступ к внешним ресурсам сети возможен.
Но, конечно, мы, как разработчики, просто не может полагаться на:
- Системный администратор настроил все правильно, или
- доступны доступные ресурсы внешней сети.
Действительно, нам нужно, чтобы сервисное приложение имеет какой-то способ умирать самостоятельно. Если сеть ресурс опускается, нам нужно сервис для остановки. Но больше Нам нужен SCM, чтобы знать, что он остановился сам по себе. Потребности SCM знать, что служба "не удалось"... и не просто закрыт вниз кем-то.
Вызов "return" или вызов исключение в методе OnStart() даже не помогает службам в процессе запуска. SCM идет весело, и процесс держится работает в диспетчере задач - хотя это фактически не делает ничего, поскольку рабочий поток никогда не был создан и начал.
Использование экземпляра ServiceController тоже не делает этого. Это похоже на SCM как нормальное закрытие - не отказ службы. Поэтому ни одна из происходят действия по восстановлению или перезапуска. (Кроме того, есть документация MSDNful предупреждение об опасностях Поток потомков ServiceBase с использованием ServiceController, чтобы делать вещи происходят с самим собой.)
Я читал статьи, в которых люди возиться с вызовами PInvoking нативный код, чтобы установить Флаг статуса "Остановлен" в SCM. Но что не завершает процесс служба работает внутри.
Мне бы очень хотелось знать предполагаемый Способ:
- Выключение службы из службы, где
- SCM присваивается уведомление о том, что служба "остановлена", и
- Процесс исчезает из диспетчера задач.
Решения с участием ServiceControllers не кажутся подходящими, если только потому что 2 не выполняется. (Что Рамочная документация противопоказания, которые кстати, неплохая масса.)
Буду признателен за любые рекомендации, указатели на документацию или даже хорошо обоснованная гипотеза.:-) Ой! А также Я с удовольствием развлекаю это Я пропустил этот момент.
Наиболее сердечно,
Росс Беннетт