#c# #command-line #service #windows-services
#c# #командная строка #Обслуживание #windows-services
Вопрос:
Я написал небольшую службу Windows, которую хочу запускать ежедневно на моем Windows Server 2008. Служба написана на C #.
- Код отлично работает в обычной форме Windows.
- Служба работает так, как должна, когда я запускаю и останавливаю ее из окна управления службами (services.msc).
Но при запуске ее в командной строке с:
net start Service1
Я получаю следующее:
The Service1 service is starting........ The Service1 service could not be started.
The service did not report an error.
More help is available by typing NET HELP:SG 3534.
Странно то, что служба все еще запущена, на экране служб я все еще вижу ее как запускающуюся, пока она не будет полностью запущена. Когда я пытаюсь остановить службу после этого, я получаю:
The service could not be controlled in its present state.
More help is available by typing NET HELPMSG 2189
И затем служба останавливается. Есть ли какой-либо способ решить эту проблему? Мне уже удалось отладить службу без каких-либо проблем, код работает. Но во время отладки в командной консоли все еще происходит то же самое, хотя я все еще могу выполнять дальнейшую отладку.
Похоже, что в методе OnStart () есть какой-то тайм-аут.. Понятия не имею.. Я довольно новичок в службах Windows (это моя первая). Я действительно пишу весь свой код в методе OnStart (), возможно, это не лучшая идея, но я не знаю, где еще его ввести.
Если бы кто-нибудь мог помочь, я был бы очень признателен.
Комментарии:
1. Возможно, вы возвращаете где-то неправильный код ошибки
2. Иоганн Блейз помог мне на правильном пути. После некоторого исследования с правильными терминами я также обнаружил это: «Проблема в том, что методы OnStart и onStop должны возвращать управление обратно диспетчеру управления службами в течение 1 минуты, чтобы диспетчер управления службами распознал, что служба запущена или остановлена». Мой код работал дольше одной минуты.
Ответ №1:
Событие OnStart используется для запуска фонового потока, который позаботится об обработке. Если метод OnStart завершается без ошибок, диспетчер служб предполагает, что служба запущена успешно. Таким образом, OnStart должен вернуться как можно скорее.
Затем используется метод onStop для остановки фоновой обработки. Успешная остановка сообщает диспетчеру служб, что служба была закрыта без ошибок.
Комментарии:
1. Я включил ее в поток, и это действительно сделало свое дело. Большое вам спасибо. Единственное, что мне сейчас интересно, есть ли возможность автоматически остановить службу после того, как поток завершит свою работу?
2. Или мне вообще нужно ее остановить? Я имею в виду, если я создам файл .bat, который запускает и останавливает мою службу, поток все равно будет выполняться, верно? Или это не очень хороший способ работы?
3. Некоторые службы Windows автоматически останавливаются после завершения обработки. Вы можете решить сделать то же самое (вызвав метод Stop изнутри службы), но в любом случае убедитесь, что вы корректно остановили фоновую обработку в методе onStop.
4. Спасибо за ваши ответы, они мне очень помогут. И последнее, я полагаю, MyThread.abort() — это не способ изящно остановить фоновую обработку? Поможет ли работа с ManualResetEvent правильно завершить поток?
5. Нитки. Следует избегать прерывания. Вы могли бы периодически проверять из функции thread, был ли установлен флаг (bool или что-то еще), и если это так, то выйдите из функции. Вы могли бы установить этот флаг из метода onStop.