I have build a windows service using a timer which is not ideal for what i want to do. I have a methord i want to call and as soon as its finnished i want it to start again and again and again. What is the best way of doing this and can you show me an example.
Can you explain a little more what you are trying to accomplish.
When using a timer in a Service you will need to use System.Threading.Timer.
If you are constantly looping then your CPU usage is going to go through the roof. If you are trying to monitor a directory you can use a FileSystemWatcher but this can be troublesome if your host computer is not running Windows. If you are trying to query a table and get results you could have it look every 15 seconds for a new record and if a new record exists mark the function as running via a boolean so that if its still running 15 seconds later it doesn't launch again.
I am going to give you an example of a timer in a system service.
Private myThreadingTimer As System.Threading.Timer
Private blnCurrentlyRunning As Boolean = False
Protected Overrides Sub OnStart(ByVal args() As String)
Dim myTimerCallback As New TimerCallback(AddressOf OnTimedEvent)
myThreadingTimer = New System.Threading.Timer(myTimerCallback, Nothing, 1000, 1000)
End Sub
Private Sub OnTimedEvent(ByVal state As Object)
If Date.Now.Second = 1 Or Date.Now.Second = 15 Or Date.Now.Second = 30 Or Date.Now.Second = 45 Then
If Not blnCurrentlyRunning Then
blnCurrentlyRunning = True
Dim myNewThread As New Thread(New ThreadStart(AddressOf MyFunctionIWantToCall))
myNewThread.Start()
End If
End If
End Sub
Public Sub MyFunctionIWantToCall()
Try
'Do Something
Catch ex As Exception
Finally
blnCurrentlyRunning = False
End Try
End Sub
private AutoResetEvent m_waitNextExec = new AutoResetEvent(false);
private int m_execTimer = 1000; //Every second
private bool m_isRunning = true;
private void SomeMethod()
{
while (m_isRunning)
{
//Do something
m_waitNextExec.WaitOne(m_execTimer);
}
}
This code gives you more control over the execution of your code. The auto reset event gives you the possibility to reduce the execution rate.
If you want to abort the execution, you just have to do:
m_isRunning = false;
m_waitNextExec.Set();