I’ve created a Windows Service called ProxyMonitor and I’m currently at the stage where the service is installs and uninstall’s the way I want it.
So I execute the application like so:
C:\\Windows\\Vendor\\ProxyMonitor.exe /install
Pretty self explanatory, and then I got to services.msc and and start the service, but when I do this I get the following message:
The Proxy Monitor Service on Local Computer started and then stopped. Some services stop automatically if there is no work to do, For example, The performance Logs and Alerts Services
My code looks like so:
public static Main(string[] Args)
{
if (System.Environment.UserInteractive)
{
/*
* Here I have my install logic
*/
}
else
{
ServiceBase.Run(new ProxyMonitor());
}
}
And then within ProxyMonitor class I have:
public ProxyMonitor()
{
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
ProxyEventLog.WriteEntry("ProxyMonitor Started");
running = true;
while (running)
{
//Execution Loop
}
}
and onStop() I just change the running variable to false;
What would I need to do to make the Service constantly active, as I would need to be monitoring the network I need to trace changes etc.
Update: 1
protected override void OnStart(string[] args)
{
base.OnStart(args);
ProxyEventLog.WriteEntry("ProxyMonitor Started");
Thread = new Thread(ThreadWorker);
Thread.Start();
}
Within the ThreadWorker I have ProxyEventLogger.WriteEntry("Main thread entered") which does not get fired.
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:The
_threadfield will hold a reference to theSystem.Threading.Threadobject you create in theOnStart()callback. The_shutdownEventfield 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.You need a function named
WorkerThreadFuncin order for this to work. It has to match theSystem.Threading.ThreadStartdelegate signature.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
_shutdownEventcomes in handy.The while loop checks the
ManualResetEventto see if it is "set" or not. Since we initialized the object withfalseabove, 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.