Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

Timer-Klasse

Stellt einen Mechanismus zum Ausführen einer Methode in angegebenen Intervallen bereit. Diese Klasse kann nicht vererbt werden.

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

[ComVisibleAttribute(true)] 
public sealed class Timer : MarshalByRefObject, IDisposable
/** @attribute ComVisibleAttribute(true) */ 
public final class Timer extends MarshalByRefObject implements IDisposable
ComVisibleAttribute(true) 
public final class Timer extends MarshalByRefObject implements IDisposable

HinweisHinweis

Das auf diese Klasse angewendete HostProtectionAttribute-Attribut besitzt den Resources-Eigenschaftenwert Synchronization | ExternalThreading. Das HostProtectionAttribute hat keine Auswirkungen auf Desktopanwendungen (die normalerweise durch Doppelklicken auf ein Symbol, Eingeben eines Befehls oder eines URL in einem Browser gestartet werden). Weitere Informationen finden Sie unter der HostProtectionAttribute-Klasse oder unter SQL Server-Programmierung und Hostschutzattribute.

Geben Sie mit einem TimerCallback-Delegaten die Methode an, die der Timer ausführen soll. Der Zeitgeberdelegat wird bei der Erstellung des Zeitgebers angegeben und kann nicht geändert werden. Die Methode wird nicht in dem Thread ausgeführt, der den Zeitgeber erstellt hat, sondern in einem vom System bereitgestellten ThreadPool-Thread.

Beim Erstellen eines Zeitgebers können Sie eine Zeitspanne angeben, die bis zum ersten Ausführen der Methode gewartet werden soll (Vorlaufzeit), sowie eine Zeitspanne, die zwischen den folgenden Ausführungen gewartet werden soll (Zeitraum). Mithilfe der Change-Methode können Sie diese Werte ändern oder den Zeitgeber deaktivieren.

HinweisHinweis

Solange Sie einen Timer verwenden, müssen Sie einen Verweis darauf beibehalten. Wie jedes verwaltete Objekt wird Timer in die Garbage Collection einbezogen, wenn keine Verweise darauf vorhanden sind. Die Tatsache, dass ein Timer noch aktiv ist, verhindert nicht, dass er von der Garbage Collection freigegeben wird.

Wenn ein Zeitgeber nicht mehr benötigt wird, können Sie die von diesem belegten Ressourcen unter Verwendung der Dispose-Methode freigeben. Verwenden Sie die Dispose(WaitHandle)-Methodenüberladung, die ein WaitHandle annimmt, um ein Signal zu empfangen, wenn der Zeitgeber freigegeben wird. Das WaitHandle wird signalisiert, wenn der Zeitgeber freigegeben wurde.

Die vom Zeitgeber ausgeführte Rückrufmethode sollte eine Wiedereintrittsmethode sein, da sie in ThreadPool-Threads aufgerufen wird. Der Rückruf kann gleichzeitig für zwei Threadpoolthreads ausgeführt werden, wenn das Zeitgeberintervall unter der für die Ausführung der Methode erforderlichen Zeit liegt oder alle Threadpoolthreads verwendet werden und der Rückruf mehrfach in die Warteschlange gestellt wird.

HinweisHinweis

System.Threading.Timer ist ein einfacher, kompakter Zeitgeber, der Rückrufmethoden verwendet und von Threads des Threadpools unterstützt wird. Es empfiehlt sich u. U., für Windows Forms System.Windows.Forms.Timer und für serverbasierte Zeitgeberfunktionen System.Timers.Timer zu verwenden. Diese Zeitgeber verwenden Ereignisse und stellen zusätzliche Features bereit.

Das folgende Codebeispiel veranschaulicht die Features der Timer-Klasse.

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();
        }
    }
}

import System.*;
import System.Threading.*;
import System.Threading.Thread;

class TimerExample
{
    public static void main(String[] args)
    {
        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",
            System.DateTime.get_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.");
    } //main
} //TimerExample

class StatusChecker
{
    private int invokeCount, maxCount;

    public StatusChecker(int count)
    {
        invokeCount = 0;
        maxCount = count;
    } //StatusChecker

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = ((AutoResetEvent)(stateInfo));

        Console.WriteLine("{0} Checking status {1,2}.", 
            System.DateTime.get_Now().ToString("h:mm:ss.fff"),
            String.valueOf(++invokeCount));
        if (invokeCount == maxCount) {
            // Reset the counter and signal Main.
            invokeCount = 0;
            autoEvent.Set();
        }
    } //CheckStatus
} //StatusChecker

Dieser Typ ist bezüglich Multithreadoperationen sicher.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0
Anzeigen: