Windows Service to run constantly
The OnStart()
callback needs to return in a timely fashion, so you'll want to kick off a thread where all your work will be performed. I would recommend adding the following fields to your class:
using System.Threading;
private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private Thread _thread;
The _thread
field will hold a reference to the System.Threading.Thread
object you create in the OnStart()
callback. The _shutdownEvent
field holds a system-level event construct that will be used to signal the thread to stop running on service shutdown.
In the OnStart()
callback, create and start your thread.
protected override void OnStart(string[] args)
{
_thread = new Thread(WorkerThreadFunc);
_thread.Name = "My Worker Thread";
_thread.IsBackground = true;
_thread.Start();
}
You need a function named WorkerThreadFunc
in order for this to work. It has to match the System.Threading.ThreadStart
delegate signature.
private void WorkerThreadFunc()
{
}
If you don't put anything in this function, the thread will start up and then immediately shutdown, so you have to put some logic in there that basically keeps the thread alive while you do your work. This is where the _shutdownEvent
comes in handy.
private void WorkerThreadFunc()
{
while (!_shutdownEvent.WaitOne(0)) {
// Replace the Sleep() call with the work you need to do
Thread.Sleep(1000);
}
}
The while loop checks the ManualResetEvent
to see if it is "set" or not. Since we initialized the object with false
above, this check returns false. Inside the loop, we sleep for 1 second. You'll want to replace this with the work you need to do - monitor proxy settings, etc.
Finally, in the OnStop()
callback of your Windows Service, you want to signal the thread to stop running. This is easy using the _shutdownEvent
.
protected override void OnStop()
{
_shutdownEvent.Set();
if (!_thread.Join(3000)) { // give the thread 3 seconds to stop
_thread.Abort();
}
}
Hope this helps.
You need to exit your OnStart
handler in order for the service controller to realize that your service has actually started. To make it work like you want, you could start a timer that ticks at an interval and processes when it ticks.
Edit:
Try putting a System.Diagnostics.Debugger.Launch() in your OnStart
to see what is happening (and put a breakpoint in ThreadWorker
). I would recommend wrapping this in #if DEBUG
to be sure it doesn't get deployed.
I just also realized that you do not give your Thread
a name:
Thread myThread = new Thread(ThreadWorker);
myThread.Start();