|Important||This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here. ArchiveDisclaimer|
The Threading.Timer class is useful to periodically run a task on a separate thread. For example, you could use a thread timer to check the status and integrity of a database or to back up critical files. The following example starts a task every two seconds and uses a flag to initiate the Dispose method that stops the timer. This example posts status to the output window, so you should make this window visible by pressing Control+Alt+O before you test the code.
Class StateObjClass ' Used to hold parameters for calls to TimerTask Public SomeValue As Integer Public TimerReference As System.Threading.Timer Public TimerCanceled As Boolean End Class Sub RunTimer() Dim StateObj As New StateObjClass() StateObj.TimerCanceled = False StateObj.SomeValue = 1 Dim TimerDelegate As New Threading.TimerCallback(AddressOf TimerTask) ' Create a timer that calls a procedure every 2 seconds. ' Note: There is no Start method; the timer starts running as soon as ' the instance is created. Dim TimerItem As New System.Threading.Timer(TimerDelegate, StateObj, _ 2000, 2000) StateObj.TimerReference = TimerItem ' Save a reference for Dispose. While StateObj.SomeValue < 10 ' Run for ten loops. System.Threading.Thread.Sleep(1000) ' Wait one second. End While StateObj.TimerCanceled = True ' Request Dispose of the timer object. End Sub Sub TimerTask(ByVal StateObj As Object) Dim State As StateObjClass = CType(StateObj, StateObjClass) Dim x As Integer ' Use the interlocked class to increment the counter variable. System.Threading.Interlocked.Increment(State.SomeValue) Debug.WriteLine("Launched new thread " & Now) If State.TimerCanceled Then ' Dispose Requested. State.TimerReference.Dispose() Debug.WriteLine("Done " & Now) End If End Sub
Thread timers are particularly useful when the System.Windows.Forms.Timer Class is unavailable, such as when you are developing console applications.
Multithreaded Applications | Thread Pooling | Thread Synchronization | Parameters and Return Values for Multithreaded Procedures | Multithreading with Forms and Controls | System.Threading Namespace | SyncLock Statement