TimerCallback Delegate (System.Threading)

Switch View :
ScriptFree
.NET Framework Class Library
TimerCallback Delegate

Represents the method that handles calls from a Timer.

Namespace:  System.Threading
Assembly:  mscorlib (in mscorlib.dll)
Syntax

Visual Basic
<ComVisibleAttribute(True)> _
Public Delegate Sub TimerCallback ( _
	state As Object _
)
C#
[ComVisibleAttribute(true)]
public delegate void TimerCallback(
	Object state
)
Visual C++
[ComVisibleAttribute(true)]
public delegate void TimerCallback(
	Object^ state
)
F#
[<ComVisibleAttribute(true)>]
type TimerCallback = 
    delegate of 
        state:Object -> unit

Parameters

state
Type: System.Object
An object containing application-specific information relevant to the method invoked by this delegate, or null.
Remarks

Use a TimerCallback delegate to specify the method that is called by a Timer. This method does not execute in the thread that created the timer; it executes in a separate thread pool thread that is provided by the system. The TimerCallback delegate invokes the method once after the start time elapses, and continues to invoke it once per timer interval until the Dispose method is called, or until the Timer.Change method is called with the interval value Infinite.

Note Note

Callbacks can occur after the Dispose() method overload has been called, because the timer queues callbacks for execution by thread pool threads. You can use the Dispose(WaitHandle) method overload to wait until all callbacks have completed.

The timer delegate is specified when the timer is constructed, and cannot be changed. The start time for a Timer is passed in the dueTime parameter of the Timer constructors, and the period is passed in the period parameter. For an example that demonstrates creating and using a TimerCallback delegate, see System.Threading.Timer.

Examples

The following code example shows how to create the delegate used with the Timer class.

Visual Basic

Imports Microsoft.VisualBasic
Imports System
Imports System.Threading

Public Class TimerExample

    <MTAThread> _
    Shared Sub Main()

        ' Create an event to signal the timeout count threshold in the
        ' timer callback.
        Dim autoEvent As New AutoResetEvent(False)

        Dim statusChecker As New StatusChecker(10)

        ' Create an inferred delegate that invokes methods for the timer.
        Dim tcb 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(tcb, 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()
    {
        // Create an event to signal the timeout count threshold in the
        // timer callback.
        AutoResetEvent autoEvent     = new AutoResetEvent(false);

        StatusChecker  statusChecker = new StatusChecker(10);

        // Create an inferred delegate that invokes methods for the timer.
        TimerCallback tcb = 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(tcb, 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
{
    private int invokeCount;
    private int  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();
        }
    }
}


Visual C++

using namespace System;
using namespace System::Threading;

ref class StatusChecker
{
private:
    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("{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();
        }
    }
};

ref class TimerExample
{
public:
    static void Main()
    {
        // Create an event to signal the timeout count threshold in the
        // timer callback.
        AutoResetEvent^ autoEvent     = gcnew AutoResetEvent(false);

        StatusChecker^  statusChecker = gcnew StatusChecker(10);

        // Create a delegate that invokes methods for the timer.
        TimerCallback^ tcb =
           gcnew 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("{0} Creating timer.\n",
            DateTime::Now.ToString("h:mm:ss.fff"));
        Timer^ stateTimer = gcnew Timer(tcb, 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->~Timer();
        Console::WriteLine("\nDestroying timer.");
    }
};

int main()
{
    TimerExample::Main();
}


Version Information

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Portable Class Library

Supported in: Portable Class Library
Platforms

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
See Also

Reference

Other Resources

Community Content

LouOttawa
A Simpler Sample
·         Public Class TimeDisplayForm
 
    'this timer is very accurate, but it runs on separate thread
    Dim timer As System.Threading.Timer
    Dim tickEventHandler As System.Threading.TimerCallback
 
 
    Private Sub TimeDisplayForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        tickEventHandler = New System.Threading.TimerCallback(AddressOf timer_Tick)
        timer = New System.Threading.Timer(tickEventHandler, Nothing, 1000, 1000)
    End Sub
 
    Private Sub timer_Tick(ByVal state As Object)
        UpdateTimeDisplay(DateTime.Now.ToLongTimeString())
    End Sub
 
    Delegate Sub UpdateTextDelegate(ByVal text As String)
 
    Private Sub UpdateTimeDisplay(ByVal text As String)
        If (Me.InvokeRequired) Then
            Dim update As New UpdateTextDelegate(AddressOf UpdateTimeDisplay)
            Me.Invoke(update, New Object() {text})
        End If
        Me.Label1.Text = text
    End Sub
 
    Private Sub TimeDisplayForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        Me.timer.Dispose() ' this is critical!
        Me.tickEventHandler = Nothing
    End Sub
End Class
----------------------------------------------------
The above is an excellent example of safe cross-thread modification of controls on a form; specifically in "UpdateTimeDisplay"
Here is the same thing in C# developed in VC# 2010 express. Pardon the formatting.
[code]
using System;
using thr=System.Threading;
using System.Windows.Forms;
namespace TimerDisplay
{
public partial class TimerDisplayForm : Form
{
public TimerDisplayForm()
{
InitializeComponent();
}
thr.Timer timer;
thr.TimerCallback tickEventHandler;
Object xstate;
private void TimerDisplayForm_Load(object sender, EventArgs e)
{
tickEventHandler = new thr.TimerCallback(timer_Tick);
xstate = new Object();
timer = new thr.Timer(tickEventHandler, null, 2000, 5000);
}
private void timer_Tick(Object state)
{
UpdateTimeDisplay(DateTime.Now.ToLongTimeString());
}

public delegate void UpdateTextDelegate(string text);
private void UpdateTimeDisplay(string text)
{/*This method is used to handle cross-thread mods
See the MSDN article "How to: Make Thread-Safe Calls to Windows Forms Controls" */
if (this.InvokeRequired) //this is true if
{
UpdateTextDelegate update = new UpdateTextDelegate( UpdateTimeDisplay);
this.Invoke(update, new object[] { text });
}
this.label1.Text = DateTime.Now.ToLongTimeString();
}
private void TimerDisplayForm_FormClosing(object sender, FormClosingEventArgs e)
{
this.timer.Dispose(); //' this is critical!
this.tickEventHandler = null;
}
}
}
[/code]