This article does not concern the bug ‘The Elapsed event of the System.Timers.Timer class is not raised in a Windows service’ which is dealt with seperately on the Microsoft website – occurs when a system.timers.timer is stopped and then started again.
Some time ago I wrote an application to process auto-generated .TSC (tab delimited text) files and send batches of emails based on the contents – worked very well but I had to remember to run it every day.
Decided to make it a service to avoid delays in sending the mails but some trouble getting the processing routines to fire on a timer.
Forms Timer does not work with Windows Services.
Timer1_Tick not working
A bit of research on the web led me to http://support.microsoft.com/default.aspx/kb/820639, which advised to be sure to drag the timer component from the Components tab instead of the Windows Forms tab. Followed these instructions but the component still created a system.windows.forms.timer object, just like it does from the windows forms tab. This will not process timer events in a Windows Service, so the code never executes.
In a Windows Service it’s necessary to use the Timer_Elapsed event, not the Timer_Tick event – Elapsed isn’t available on the Windows Forms timer, only the tick event is.
Resolution: System.Timers.Timer Timer_Elapsed
Surprisingly, you have to add the System.Timers Timer from the ‘.Net Framework Components’ tab by right-clicking the Components Tab in the toolbox and selecting ‘Choose Components’ – this is the one to use for a Service, either by dragging onto the designer in the IDE or in code (see end of article).
Once the correct timer component was in place, the Timer_Elapsed event worked perfectly:
Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
The rest of the code loops through .TSC files in a specified location.
It reads each file line-by-line, builds an email on the fly from the contents and relays this through Exchange using System.Net.Mail, finally deleting each.TSC on successful completion and emailing the relevant team a status report.
Now with no manual intervention…
More information on Timer1_Elapsed may be found on Microsofts Website
Example of System.Timer in code
Private Sub CreateTimer()
Dim Timer1 As New System.Timers.Timer()
Timer1.Interval = 5000
Timer1.Enabled = True
AddHandler Timer1.Elapsed, _
New System.Timers.ElapsedEventHandler(AddressOf Me.Timer1_Elapsed)
Private Sub Timer1_Elapsed(ByVal sender As System.Object, _
ByVal e As System.Timers.ElapsedEventArgs)
System.Windows.Forms.MessageBox.Show(“Elapsed!”, “Timer Event Raised!”)
Update: Thought occurs… if you just want to delay processing for a period you could always just loop using System.Threading.Thread.Sleep(delay in milliseconds)…?