Timer Klasse

Definition

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

public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, System::Threading::ITimer
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, System.Threading.ITimer
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
    interface ITimer
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements ITimer
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Vererbung
Timer
Vererbung
Attribute
Implementiert

Beispiele

Im folgenden Beispiel wird eine StatusChecker Klasse definiert, die eine CheckStatus Methode enthält, deren Signatur mit der TimerCallback Stellvertretung identisch ist. Das state Argument der CheckStatus Methode ist ein AutoResetEvent Objekt, das zum Synchronisieren des Anwendungsthreads und des Threadpoolthreads verwendet wird, der den Rückrufdelegat ausführt. Die StatusChecker Klasse enthält auch zwei Zustandsvariablen:

invokeCount
Gibt an, wie oft die Rückrufmethode aufgerufen wurde.

maxCount
Bestimmt, wie oft die Rückrufmethode aufgerufen werden soll.

Der Anwendungsthread erstellt den Timer, der eine Sekunde wartet und dann alle 250 Millisekunden die CheckStatus Rückrufmethode ausführt. Der Anwendungsthread blockiert dann, bis das AutoResetEvent Objekt signalisiert wird. Wenn die CheckStatus Rückrufmethode mal ausgeführt wird maxCount , ruft sie die AutoResetEvent.Set Methode auf, um den Zustand des AutoResetEvent Objekts festzulegen, das signalisiert wird. Beim ersten Mal ruft der Anwendungsthread die Change(Int32, Int32) Methode auf, sodass die Rückrufmethode jetzt alle halbe Sekunde ausgeführt wird. Es wird erneut blockiert, bis das AutoResetEvent Objekt signalisiert wird. In diesem Fall wird der Timer durch Aufrufen der Dispose Methode zerstört, und die Anwendung wird beendet.

using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        var autoEvent = new AutoResetEvent(false);
        
        var statusChecker = new StatusChecker(10);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", 
                          DateTime.Now);
        var stateTimer = new Timer(statusChecker.CheckStatus, 
                                   autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne();
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne();
        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 the waiting thread.
            invokeCount = 0;
            autoEvent.Set();
        }
    }
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Use an AutoResetEvent to signal the timeout threshold in the
        ' timer callback has been reached.
        Dim autoEvent As New AutoResetEvent(False)

        Dim statusChecker As New StatusChecker(10)

        ' Create a timer that invokes CheckStatus after one second, 
        ' and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer." & vbCrLf, 
                          DateTime.Now)
        Dim stateTimer As New Timer(AddressOf statusChecker.CheckStatus, 
                                    autoEvent, 1000, 250)

        ' When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne()
        stateTimer.Change(0, 500)
        Console.WriteLine(vbCrLf & "Changing period to .5 seconds." & vbCrLf)

        ' When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne()
        stateTimer.Dispose()
        Console.WriteLine(vbCrLf & "Destroying timer.")
    End Sub
End Module

Public Class StatusChecker
    Dim invokeCount, maxCount As Integer 

    Sub New(count As Integer)
        invokeCount  = 0
        maxCount = count
    End Sub

    ' The timer callback method.
    Sub CheckStatus(stateInfo As Object)
        Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
        invokeCount += 1
        Console.WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.", 
                          DateTime.Now, invokeCount)
        If invokeCount = maxCount Then
            ' Reset the counter and signal the waiting thread.
            invokeCount = 0
            autoEvent.Set()
        End If
    End Sub
End Class
' The example displays output like the following:
'       11:59:54.202 Creating timer.
'       
'       11:59:55.217 Checking status  1.
'       11:59:55.466 Checking status  2.
'       11:59:55.716 Checking status  3.
'       11:59:55.968 Checking status  4.
'       11:59:56.218 Checking status  5.
'       11:59:56.470 Checking status  6.
'       11:59:56.722 Checking status  7.
'       11:59:56.972 Checking status  8.
'       11:59:57.223 Checking status  9.
'       11:59:57.473 Checking status 10.
'       
'       Changing period to .5 seconds.
'       
'       11:59:57.474 Checking status  1.
'       11:59:57.976 Checking status  2.
'       11:59:58.476 Checking status  3.
'       11:59:58.977 Checking status  4.
'       11:59:59.477 Checking status  5.
'       11:59:59.977 Checking status  6.
'       12:00:00.478 Checking status  7.
'       12:00:00.980 Checking status  8.
'       12:00:01.481 Checking status  9.
'       12:00:01.981 Checking status 10.
'       
'       Destroying timer.

Hinweise

Verwenden Sie einen TimerCallback Delegaten, um die Auszuführende Methode Timer anzugeben. Die Signatur der TimerCallback Stellvertretung lautet:

void TimerCallback(Object state)
Sub TimerCallback(state As Object)

Der Zeitgeberdelegat wird beim Erstellen des Timers angegeben und kann nicht geändert werden. Die Methode wird nicht für den Thread ausgeführt, der den Timer erstellt hat. sie wird in einem ThreadPool vom System bereitgestellten Thread ausgeführt.

Tip

.NET umfasst mehrere Timerklassen, von denen jede verschiedene Funktionen bietet:

  • System.Timers.Timer, das ein Ereignis auslöst und den Code in einem oder mehreren Ereignisabständen in regelmäßigen Intervallen ausführt. Die Klasse ist für die Verwendung als serverbasierte oder Dienstkomponente in einer Multithreadumgebung vorgesehen; sie hat keine Benutzeroberfläche und ist zur Laufzeit nicht sichtbar.
  • System.Threading.Timer, die eine einzelne Rückrufmethode in einem Threadpoolthread in regelmäßigen Intervallen ausführt. Die Rückrufmethode wird definiert, wenn der Timer instanziiert wird und nicht geändert werden kann. Wie die System.Timers.Timer Klasse ist diese Klasse für die Verwendung als serverbasierte oder Dienstkomponente in einer Multithreadumgebung vorgesehen. Sie verfügt über keine Benutzeroberfläche und ist zur Laufzeit nicht sichtbar.
  • System.Windows.Forms.Timer, einer Windows Forms Komponente, die ein Ereignis auslöst und den Code in einem oder mehreren Ereignisabständen in regelmäßigen Intervallen ausführt. Die Komponente verfügt über keine Benutzeroberfläche und ist für die Verwendung in einer Singlethread-Umgebung konzipiert. sie wird im UI-Thread ausgeführt.
  • System.Web.UI.Timer (nur .NET Framework), eine ASP.NET Komponente, die asynchrone oder synchrone Webseitenpostbacks in regelmäßigen Abständen ausführt.
  • System.Windows.Threading.DispatcherTimer, ein Timer, der in die Warteschlange Dispatcher integriert ist. Dieser Timer wird mit einer angegebenen Priorität in einem angegebenen Zeitintervall verarbeitet.

Wenn Sie einen Timer erstellen, können Sie einen Zeitraum angeben, der vor der ersten Ausführung der Methode (Fälligkeitszeit) gewartet werden soll, und eine Zeitspanne, die zwischen nachfolgenden Ausführungen (Zeitraum) gewartet werden soll. Die Timer Klasse hat die gleiche Auflösung wie die Systemuhr. Dies bedeutet, dass der TimerCallback Delegat in Intervallen ausgeführt wird, die durch die Auflösung der Systemuhr definiert sind, die etwa 15 Millisekunden auf Windows 7 und Windows 8 Systemen beträgt. Sie können die Fälligkeitszeit und den Fälligkeitszeitraum ändern oder den Timer mithilfe der Change Methode deaktivieren.

Note

Solange Sie ein Objekt Timerverwenden, müssen Sie einen Verweis darauf beibehalten. Wie bei jedem verwalteten Objekt unterliegt eine Timer Garbage Collection, wenn keine Verweise darauf vorhanden sind. Die Tatsache, dass eine Timer noch aktiv ist, verhindert nicht, dass sie gesammelt wird.

Note

Die verwendete Systemuhr ist die gleiche Uhr, die von GetTickCount verwendet wird, was nicht von Änderungen betroffen ist, die mit timeBeginPeriod und timeEndPeriod vorgenommen wurden.

Wenn ein Timer nicht mehr benötigt wird, verwenden Sie die Dispose Methode, um die vom Timer gehaltenen Ressourcen freizugeben. Beachten Sie, dass Rückrufe auftreten können, nachdem die Dispose() Methodenüberladung aufgerufen wurde, da der Timer Rückrufe für die Ausführung durch Threadpoolthreads in die Warteschlange stellt. Sie können die Dispose(WaitHandle) Methodenüberladung verwenden, um zu warten, bis alle Rückrufe abgeschlossen sind.

Die vom Timer ausgeführte Rückrufmethode sollte erneut ausgeführt werden, da sie für ThreadPool Threads aufgerufen wird. Der Rückruf kann gleichzeitig in zwei Threadpoolthreads ausgeführt werden, wenn das Zeitgeberintervall kleiner ist als die Zeit, die zum Ausführen des Rückrufs erforderlich ist, oder wenn alle Threadpoolthreads verwendet werden und der Rückruf mehrmals in die Warteschlange gestellt wird.

Note

System.Threading.Timer ist ein einfacher, einfacher Timer, der Rückrufmethoden verwendet und von Threadpoolthreads bereitgestellt wird. Es wird nicht für die Verwendung mit Windows Forms empfohlen, da die Rückrufe nicht im Benutzeroberflächenthread auftreten. System.Windows.Forms.Timer ist eine bessere Wahl für die Verwendung mit Windows Forms. Bei serverbasierten Zeitgeberfunktionen können Sie die Verwendung System.Timers.Timerin Betracht ziehen, die Ereignisse auslöst und zusätzliche Features aufweist.

Konstruktoren

Name Beschreibung
Timer(TimerCallback, Object, Int32, Int32)

Initialisiert eine neue Instanz der Timer Klasse, wobei eine 32-Bit-ganzzahl mit Vorzeichen verwendet wird, um das Zeitintervall anzugeben.

Timer(TimerCallback, Object, Int64, Int64)

Initialisiert eine neue Instanz der Timer Klasse, wobei 64-Bit-ganzzahlige Ganzzahlen verwendet werden, um Zeitintervalle zu messen.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Initialisiert eine neue Instanz der Timer Klasse, wobei Werte zum Messen von Zeitintervallen verwendet TimeSpan werden.

Timer(TimerCallback, Object, UInt32, UInt32)

Initialisiert eine neue Instanz der Timer Klasse, wobei 32-Bit-ganzzahlen ohne Vorzeichen verwendet werden, um Zeitintervalle zu messen.

Timer(TimerCallback)

Initialisiert eine neue Instanz der Timer Klasse mit einer unendlichen Periode und einer unendlichen Fälligkeitszeit, wobei das neu erstellte Timer Objekt als Zustandsobjekt verwendet wird.

Eigenschaften

Name Beschreibung
ActiveCount

Ruft die Anzahl der Zeitgeber ab, die derzeit aktiv sind. Ein aktiver Timer wird registriert, um irgendwann in Zukunft zu ticken und wurde noch nicht abgebrochen.

Methoden

Name Beschreibung
Change(Int32, Int32)

Ändert die Startzeit und das Intervall zwischen Methodenaufrufen für einen Timer, wobei 32-Bit-ganzzahlige Ganzzahlen verwendet werden, um Zeitintervalle zu messen.

Change(Int64, Int64)

Ändert die Startzeit und das Intervall zwischen Methodenaufrufen für einen Timer, wobei 64-Bit-ganzzahlige Ganzzahlen verwendet werden, um Zeitintervalle zu messen.

Change(TimeSpan, TimeSpan)

Ändert die Startzeit und das Intervall zwischen Methodenaufrufen für einen Timer mithilfe von TimeSpan Werten zum Messen von Zeitintervallen.

Change(UInt32, UInt32)

Ändert die Startzeit und das Intervall zwischen Methodenaufrufen für einen Timer, wobei 32-Bit-ganzzahlen ohne Vorzeichen verwendet werden, um Zeitintervalle zu messen.

CreateObjRef(Type)

Erstellt ein Objekt, das alle relevanten Informationen enthält, die zum Generieren eines Proxys erforderlich sind, der für die Kommunikation mit einem Remoteobjekt verwendet wird.

(Geerbt von MarshalByRefObject)
Dispose()

Gibt alle Ressourcen frei, die von der aktuellen Instanz von Timer.

Dispose(WaitHandle)

Gibt alle Ressourcen frei, die von der aktuellen Instanz von Timer und Signalen verwendet werden, wenn der Timer verworfen wurde.

DisposeAsync()

Gibt alle Ressourcen frei, die von der aktuellen Instanz von Timer.

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
Finalize()

Ermöglicht es einem Objekt, Ressourcen freizugeben und andere Bereinigungsvorgänge auszuführen, bevor es von der Garbage Collection erneut beansprucht wird.

GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetLifetimeService()
Veraltet.

Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinie für diese Instanz steuert.

(Geerbt von MarshalByRefObject)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
InitializeLifetimeService()
Veraltet.

Ruft ein Lebensdauerdienstobjekt ab, um die Lebensdauerrichtlinie für diese Instanz zu steuern.

(Geerbt von MarshalByRefObject)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
MemberwiseClone(Boolean)

Erstellt eine flache Kopie des aktuellen MarshalByRefObject Objekts.

(Geerbt von MarshalByRefObject)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Erweiterungsmethoden

Name Beschreibung
ConfigureAwait(IAsyncDisposable, Boolean)

Konfiguriert, wie auf die von einem asynchronen Einweg zurückgegebenen Aufgaben gewartet wird.

Gilt für:

Threadsicherheit

Dieser Typ ist threadsicher.

Weitere Informationen