This is what I got:
protected override void OnStart(string[] args) { if (SomeApp.Initialize()) { SomeApp.StartMonitorAndWork(); base.OnStart(args); } } protected override void OnStop() { SomeApp.TearDown(); base.OnStop(); }
Here Initialize reads a config file and if it's wrong there's nothing to do so service should STOP! If config is ok StartMonitorAndWork starts:
Timer(new TimerCallback(DoWork), null, startTime, loopTime);
and DoWork polls database periodically.
If Initialize fails (i check log file) and I try to stop service from Administrative Tools->Services i get:
Could not stop the SomeService on Local Computer. The service did not return an error. This could be internal Windows error or an internal service error. If the problem persists, contact system administrator.
The question is: "Is exiting OnStart without doing nothing enough if Initialize returns false?
OR should there be something like this:
private void ExitService() { this.OnStop(); System.Environment.Exit(1); } protected override void OnStart(string[] args) { if (ObjectFolderApp.Initialize()) { SomeApp.StartMonitorAndWork(); base.OnStart(args); } else { ExitService(); } }
Thanks & BR - Matti
EDIT: I came up with something like this:
protected override void OnStart(string[] args) { try { if (SomeApp.Initialize()) { SomeApp.StartMonitorAndWork(); base.OnStart(args); } else { Stop(); } } catch { Stop(); } } protected override void OnStop() { try { SomeApp.TearDown(); base.OnStop(); } catch { base.OnStop(); } }
A Windows service is a long-running application that can be started automatically when your system is started. You can pause your service and resume or even restart it if need be. Once you have created a Windows service, you can install it in your system using the InstallUtil.exe command line utility.
after testing all the approaches I personally prefer calling
Environment.FailFast("Configuration is wrong.");
Main goal is that the fail explanation is written in Event Log and FailFast affects on Recovery settings of your service. So if you configure recovery and configuration gets correct your service will start automatically.
I know it's not pretty but throwing an exception in OnStart also works.
If your service is setup to "Autolog" this will also write a your exception message to the EventLog automatically.
protected override void OnStart(string[] args) { if (ObjectFolderApp.Initialize()) { SomeApp.StartMonitorAndWork(); base.OnStart(args); } else { throw new Exception("What went wrong"); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With