Timer Class
Provides a mechanism for executing a method at specified intervals. This class cannot be inherited.
For a list of all members of this type, see Timer Members.
System.Object
System.MarshalByRefObject
System.Threading.Timer
[Visual Basic] NotInheritable Public Class Timer Inherits MarshalByRefObject Implements IDisposable [C#] public sealed class Timer : MarshalByRefObject, IDisposable [C++] public __gc __sealed class Timer : public MarshalByRefObject, IDisposable [JScript] public class Timer extends MarshalByRefObject implements IDisposable
Thread Safety
This type is safe for multithreaded operations.
Remarks
Use a TimerCallback delegate to specify the method you want the Timer to execute. The timer delegate is specified when the timer is constructed, and cannot be changed. The method does not execute in the thread that created the timer; it executes in a thread pool thread supplied by the system.
When you create a timer, you can specify an amount of time to wait before the first execution of the method (due time), and an amount of time to wait between subsequent executions (period). You can change these values, or disable the timer, using the Change method.
Note As long as you are using a Timer, you must keep a reference to it. As with any managed object, a Timer is subject to garbage collection when there are no references to it. The fact that a Timer is still active does not prevent it from being collected.
When a timer is no longer needed, use the Dispose method to free the resources held by the timer.
Note System.Threading.Timer is a simple, lightweight timer that uses callback methods and is served by threadpool threads. You might also consider System.Windows.Forms.Timer for use with Windows forms, and System.Timers.Timer for server-based timer functionality. These timers use events and have additional features.
Example
[Visual Basic, C#, C++] The following code example demonstrates the features of the Timer class.
[Visual Basic] Imports Microsoft.VisualBasic Imports System Imports System.Threading Public Class TimerExample Shared Sub Main() Dim autoEvent As New AutoResetEvent(False) Dim statusChecker As New StatusChecker(10) ' Create the delegate that invokes methods for the timer. Dim timerDelegate As TimerCallback = _ AddressOf statusChecker.CheckStatus ' Create a timer that signals the delegate to invoke ' CheckStatus after one second, and every 1/4 second ' thereafter. Console.WriteLine("{0} Creating timer." & vbCrLf, _ DateTime.Now.ToString("h:mm:ss.fff")) Dim stateTimer As Timer = _ New Timer(timerDelegate, autoEvent, 1000, 250) ' When autoEvent signals, change the period to every ' 1/2 second. autoEvent.WaitOne(5000, False) stateTimer.Change(0, 500) Console.WriteLine(vbCrLf & "Changing period." & vbCrLf) ' When autoEvent signals the second time, dispose of ' the timer. autoEvent.WaitOne(5000, False) stateTimer.Dispose() Console.WriteLine(vbCrLf & "Destroying timer.") End Sub End Class Public Class StatusChecker Dim invokeCount, maxCount As Integer Sub New(count As Integer) invokeCount = 0 maxCount = count End Sub ' This method is called by the timer delegate. Sub CheckStatus(stateInfo As Object) Dim autoEvent As AutoResetEvent = _ DirectCast(stateInfo, AutoResetEvent) invokeCount += 1 Console.WriteLine("{0} Checking status {1,2}.", _ DateTime.Now.ToString("h:mm:ss.fff"), _ invokeCount.ToString()) If invokeCount = maxCount Then ' Reset the counter and signal to stop the timer. invokeCount = 0 autoEvent.Set() End If End Sub End Class [C#] using System; using System.Threading; class TimerExample { static void Main() { AutoResetEvent autoEvent = new AutoResetEvent(false); StatusChecker statusChecker = new StatusChecker(10); // Create the delegate that invokes methods for the timer. TimerCallback timerDelegate = new TimerCallback(statusChecker.CheckStatus); // Create a timer that signals the delegate to invoke // CheckStatus after one second, and every 1/4 second // thereafter. Console.WriteLine("{0} Creating timer.\n", DateTime.Now.ToString("h:mm:ss.fff")); Timer stateTimer = new Timer(timerDelegate, autoEvent, 1000, 250); // When autoEvent signals, change the period to every // 1/2 second. autoEvent.WaitOne(5000, false); stateTimer.Change(0, 500); Console.WriteLine("\nChanging period.\n"); // When autoEvent signals the second time, dispose of // the timer. autoEvent.WaitOne(5000, false); stateTimer.Dispose(); Console.WriteLine("\nDestroying timer."); } } class StatusChecker { int invokeCount, maxCount; public StatusChecker(int count) { invokeCount = 0; maxCount = count; } // This method is called by the timer delegate. public void CheckStatus(Object stateInfo) { AutoResetEvent autoEvent = (AutoResetEvent)stateInfo; Console.WriteLine("{0} Checking status {1,2}.", DateTime.Now.ToString("h:mm:ss.fff"), (++invokeCount).ToString()); if(invokeCount == maxCount) { // Reset the counter and signal Main. invokeCount = 0; autoEvent.Set(); } } } [C++] #using <mscorlib.dll> using namespace System; using namespace System::Threading; __gc class StatusChecker { int invokeCount, maxCount; public: StatusChecker(int count) : invokeCount(0), maxCount(count) {} // This method is called by the timer delegate. void CheckStatus(Object* stateInfo) { AutoResetEvent* autoEvent = dynamic_cast<AutoResetEvent*>(stateInfo); Console::WriteLine(S"{0} Checking status {1,2}.", DateTime::Now.ToString("h:mm:ss.fff"), (++invokeCount).ToString()); if(invokeCount == maxCount) { // Reset the counter and signal main. invokeCount = 0; autoEvent->Set(); } } }; void main() { AutoResetEvent* autoEvent = new AutoResetEvent(false); StatusChecker* statusChecker = new StatusChecker(10); // Create the delegate that invokes methods for the timer. TimerCallback* timerDelegate = new TimerCallback(statusChecker, &StatusChecker::CheckStatus); // Create a timer that signals the delegate to invoke CheckStatus // after one second, and every 1/4 second thereafter. Console::WriteLine(S"{0} Creating timer.\n", DateTime::Now.ToString("h:mm:ss.fff")); Timer* stateTimer = new Timer(timerDelegate, autoEvent, 1000, 250); // When autoEvent signals, change the period to every 1/2 second. autoEvent->WaitOne(5000, false); stateTimer->Change(0, 500); Console::WriteLine(S"\nChanging period.\n"); // When autoEvent signals the second time, dispose of the timer. autoEvent->WaitOne(5000, false); stateTimer->Dispose(); Console::WriteLine(S"\nDestroying timer."); }
[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button
in the upper-left corner of the page.
Requirements
Namespace: System.Threading
Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family, .NET Compact Framework
Assembly: Mscorlib (in Mscorlib.dll)
See Also
Timer Members | System.Threading Namespace | TimerCallback | Timer | Thread Pooling