If you want to schedule something to run or your program takes long time to process, Sometimes we may have to create a seperate service application,
What i happened to write this post is, My client wanted me to write an application to send emails in specific time periods, So to achieve that I thought of writing a windows service application.
We can install this service in your server or local computer and configure it to run on intervals using a timer. Let’s start coding.
When we create a windows service from visual studio, It gives us a service class with constructor method, OnStart and OnStop methods as follows.
I need to periodically perform a task, for that i need a timer component, We can add a timer into our service design from toolbox
we need to initialise timer component inside the OnStart method, then I set timer interval and added a elapsed event to track each interval.
inside timer elapsed event, actual task is going to run. elapsed event is called for each 2 minutes according to this code sample
to stop the execution, OnStop event is used.
Before installing the service in your pc, we need to create a installer class,
Add installer class as shown above
in Installer class, we need to give a service name, so we can identify the service by its name.
service is getting created after we build the application. we can find the .exe file in the bin folder. But we can’t install the service by double clicking on it
we have to install it to the local pc or server
InstallUtil.exe is used to install/uninstall services in local machine or server. We can run installUtil command from Developer command prompt,
type InstallUtil.exe with full path to the service exe file.
But this doesn’t going to install the service, It throws an error.
It seems like we don’t have access to install the service, I had to spend few minutes to find the issue,
run Developer commad prompt as administrator, then this permission issue is getting resolved.
We can install a service using cmd as well,
run cmd as administrator, then we can install the service using cmd as well.
We can check available services, by just typing services in your program list.
I gave service name as ‘test service’ in installer class.
I tried to start the service from the panel, But it didnt work,
I came across with this issue as well, spent lot of hours to find the issue, this issue comes normally when code has some kind of a error. It’s somewhat difficult to debug a windows service application to find out errors,
normally in a windows service, program.cs looks like this.
If we want to check whether our service implementation has any issue, we can use this trick
manually start a method that has exact same code as the service implementation.
inside of start method implementation, we can check whether service logic works properly.
using this trick, we can identify our service logic is working fine.
Another way of testing the program logic is, create another console application and call service logic method from console app and verify it works fine.
If we want to debug onStart method, we can launch the debugger in start method
we can launch the debugger like this,
we can debug the code like this.
But in here specific file we attatched into debugger is getting loaded. So other files are not loaded. Only we can debug the service file as this code sample shows.
In my service, i need to access to the database, But it gives me an error like this.
Login failed. Login failed for user ‘NT AUTHORITY\SYSTEM’
windows service is running on ‘NT AUTHORITY\SYSTEM’ login. this login doesn’t seem to have access to the database
To resolve this, add this in your connectionstring, Integrated Security=SSPI or else create a user account for ‘NT AUTHORITY\SYSTEM’ in your database server and give necessary permissions.
These are the guidelines to create a windows service, so it’s your time to try it.
You can find a sample windows service application from here, https://github.com/hansamaligamage/Scheduler