служба Windows останавливается и запускается немедленно, но не должна - PullRequest
3 голосов
/ 18 февраля 2009

Я создаю службу Windows, и после установки службы она останавливается и запускается немедленно, но это не должно происходить вообще. Ранее я получал сообщения о том, что служба не отвечала на команду запуска своевременно, поэтому я вынул код инициализации и поместил его в поток, и теперь я нахожусь здесь:

protected override void OnStart(string[] args)
{
    this.EventLog.WriteEntry("ATNotifier Started");

    ThreadPool.QueueUserWorkItem(WaitOnEmailsChanged);
    ThreadPool.QueueUserWorkItem(Init, "IP");
}

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

Поток Init выполняет все виды операций, включая создание и запуск объекта System.Timers.Timer, метод Elapsed которого является основой службы.

Я не могу понять, почему это началось, а затем сразу остановилось. Следует также отметить, что средство просмотра событий не показывает журналы из этого приложения.

edit> Я попытался создать «правильные» темы с теми же результатами, и я удалил все, кроме создания и запуска таймера, вот так:

protected override void OnStart(string[] args)
{
    this.EventLog.WriteEntry("ATNotifier Started");

    m_Timer = new System.Timers.Timer(90000.0); // 1.5 mins
    m_Timer.Elapsed += new ElapsedEventHandler(m_Timer_Elapsed);

    m_Timer.Start();
}

и я все еще получаю то же сообщение. Как будто OnStart никогда не вызывается.

Ответы [ 5 ]

3 голосов
/ 18 февраля 2009

Код, который вы разместили, не имеет смысла для меня. Зачем устанавливать обработчик событий перед созданием таймера?

    m_Timer.Elapsed += new ElapsedEventHandler(m_Timer_Elapsed);
    m_Timer = new System.Timers.Timer(90000.0); // 1.5 mins

Разве эти две строки не должны поменяться местами?

3 голосов
/ 18 февраля 2009

Может быть неожиданно остановлено, если ваш основной поток завершает работу по исключению.

2 голосов
/ 18 февраля 2009

Проблема оказалась в том, что EventLog.WriteEntry выдавал ошибку, потому что с ним не было связано ни одного EventSource. см http://msdn.microsoft.com/en-us/library/xzwc042w.aspx

1 голос
/ 18 февраля 2009

Насколько я помню, вы должны активно сообщать диспетчеру службы, что служба успешно запущена - в противном случае возвращается метод OnStart, и если об изменении состояния не сообщалось, диспетчер службы предполагает, что служба прервана без фактической успешной загрузки.

Сообщение о том, что ваш сервис успешно запущен, выполняется IIRC базовым классом Service, поэтому добавьте следующее в нижнюю часть метода OnStart:

base.OnStart(args);
0 голосов
/ 18 февраля 2009

ThreadPool - это фоновые темы; они не поддержат процесс. Я подозреваю, что вам нужна "правильная" тема ...

Попробуйте: new Thread(SomeCode).Start(); или аналогичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...