Search code examples
c#windows-servicesthreadpoolqueueuserworkitem

Windows Service not completely starting


I made this small windows service in c# and I believe I may have done something wrong with my ThreadPool code that prevents my Windows Service from completely starting. If you must know, the windows service seems to be running perfectly only that when looked upon the Services console, it still states that it is "starting". When I restarted my server, the service seem to have stopped again even though I have set it to Automatic startup.

Please see my code below:

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);

}

Solution

  • I think you could wrap the logic inside OnStart in a thread. This thread would be closed when you received an OnStop event.

    Something like this:

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