Export (0) Print
Expand All

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 Language Filter 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

Show:
© 2014 Microsoft