Служба Windows не запускается полностью - PullRequest
3 голосов
/ 08 июня 2011

Я сделал эту маленькую службу Windows в C #, и я думаю, что, возможно, я сделал что-то не так с моим кодом ThreadPool, который мешает моему Windows Service полностью запуститься. Если вы должны знать, что служба Windows, кажется, работает отлично только тогда, когда при взгляде на консоль служб она все еще заявляет, что она «запускается». Когда я перезапустил свой сервер, служба, кажется, снова остановилась, хотя я установил для нее автоматический запуск.

Пожалуйста, смотрите мой код ниже:

protected override void OnStart(string[] args)
{
     int itemCount = itemList.Count;

     this.doneEvents = new ManualResetEvent[itemCount];
     for (int i = 0; i < itemCount; i++)
     {
         int oId = this.itemList[i];
         this.doneEvents[i] = new ManualResetEvent(false);

         ThreadPool.QueueUserWorkItem(data =>
         {
             while (this.activated)
             {
                 DateTime start = DateTime.Now;

                 // my code here

                 // choke point
                 TimeSpan duration = (DateTime.Now - start);
                 if (duration.Milliseconds < CONST_WAITMILLISECONDS)
                    Thread.Sleep((CONST_WAITMILLISECONDS - duration.Milliseconds));
              }

              this.doneEvents[i].Set(); // thread done

            }, oId);
         }

         WaitHandle.WaitAll(doneEvents);

}

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Вы блокируете вызов OnStart с помощью WaitHandle.WaitAll(doneEvents);. Windows пытается запустить службу, но время ожидания истекло из-за WaitAll.

Вам нужно разрешить OnStart завершиться, если вы хотите, чтобы Windows считала службу запущенной.

2 голосов
/ 08 июня 2011

Я думаю, вы могли бы обернуть логику внутри OnStart в поток. Этот поток будет закрыт, когда вы получите событие OnStop.

Примерно так:

Thread _ServiceThread;
protected override void OnStart(string[] args) { 
    _ServiceThread = new Thread(() => { /* your current OnStart logic here...*/ });
    _ServiceThread.Start();
}
protected override void OnStop() {
    _ServiceThread.Stop();
}
...