title: How do I safely stop a C# .NET thread running in a Windows service?
body: <p>I am maintaining some code which looks something like this.  It's a Windows service which does some work every 30 minutes.  The ActualWorkDoneHere method takes about 30 seconds to run, but if it is stopped while running it can leave things in a bad state.  What is the best way to prevent that from happening?  Should I replace the While(true) with a boolean which is set to false in the onstop method (removing the thread Abort call)?  Is there some way to tell if a thread is sleeping?</p>
  
  <pre><code>namespace WorkService
  {
      public partial class WorkService : ServiceBase
      {
          private Thread _workerThread = null;
  
          public WorkService()
          {
              InitializeComponent();
          }
  
          protected override void OnStart(string[] args)
          {
              _workerThread = new Thread(new ThreadStart(DoWork));
              _workerThread.Start();
          }
  
          protected override void OnStop()
          {
              _workerThread.Abort();
          }
  
          static void DoWork()
          {
              int sleepMinutes = 30;
  
              while (true)
              {
                   ActualWorkDoneHere();
  
                   System.Threading.Thread.Sleep(new TimeSpan(0, sleepMinutes, 0));
              }
          }
      }
  }
  </code></pre>