Freigeben über


Timer

.NET bietet drei Zeitgeber für die Verwendung in einer Multithread-Umgebung:

Hinweis

Einige .NET-Implementierungen können zusätzliche Zeitgeber enthalten:

  • System.Windows.Forms.Timer: eine Windows Forms-Komponente, die ein Ereignis in regelmäßigen Abständen auslöst. Die Komponente verfügt über keine Benutzeroberfläche und ist für die Verwendung in einer Singlethread-Umgebung vorgesehen.
  • System.Web.UI.Timer: eine ASP.NET Komponente, die asynchrone oder synchrone Webseitenpostbacks in regelmäßigen Intervallen ausführt.
  • System.Windows.Threading.DispatcherTimer: ein Zeitgeber, der in die Dispatcher Warteschlange integriert ist, die zu einem bestimmten Zeitintervall und zu einer bestimmten Priorität verarbeitet wird.

Die System.Threading.Timer-Klasse

Mit der System.Threading.Timer Klasse können Sie kontinuierlich eine Stellvertretung in bestimmten Zeitintervallen aufrufen. Sie können diese Klasse auch verwenden, um einen einzelnen Aufruf eines Delegaten in einem bestimmten Zeitintervall zu planen. Der Delegat wird in einem ThreadPool Thread ausgeführt.

Wenn Sie ein System.Threading.Timer Objekt erstellen, geben Sie einen TimerCallback Delegaten an, der die Rückrufmethode definiert, ein optionales Statusobjekt, das an den Rückruf übergeben wird, die Zeitspanne, die vor dem ersten Aufruf des Rückrufs verzögert werden muss, und das Zeitintervall zwischen Rückrufaufrufen. Rufen Sie die Timer.Dispose Methode auf, um einen ausstehenden Timer abzubrechen.

Im folgenden Beispiel wird ein Timer erstellt, der die bereitgestellte Stellvertretung zum ersten Mal nach einer Sekunde (1000 Millisekunden) aufruft und dann alle zwei Sekunden aufruft. Das Statusobjekt im Beispiel wird verwendet, um zu zählen, wie oft der Delegat aufgerufen wird. Der Timer wird gestoppt, wenn der Delegierer mindestens zehnmal aufgerufen wurde.

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    private static Timer timer;

    static void Main(string[] args)
    {
        var timerState = new TimerState { Counter = 0 };

        timer = new Timer(
            callback: new TimerCallback(TimerTask),
            state: timerState,
            dueTime: 1000,
            period: 2000);

        while (timerState.Counter <= 10)
        {
            Task.Delay(1000).Wait();
        }

        timer.Dispose();
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
    }

    private static void TimerTask(object timerState)
    {
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.");
        var state = timerState as TimerState;
        Interlocked.Increment(ref state.Counter);
    }

    class TimerState
    {
        public int Counter;
    }
}
Imports System.Threading

Module Program

    Private Timer As Timer

    Sub Main(args As String())

        Dim StateObj As New TimerState
        StateObj.Counter = 0

        Timer = New Timer(New TimerCallback(AddressOf TimerTask), StateObj, 1000, 2000)

        While StateObj.Counter <= 10
            Task.Delay(1000).Wait()
        End While

        Timer.Dispose()
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.")
    End Sub

    Private Sub TimerTask(ByVal StateObj As Object)

        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.")

        Dim State As TimerState = CType(StateObj, TimerState)
        Interlocked.Increment(State.Counter)
    End Sub

    Private Class TimerState
        Public Counter As Integer
    End Class
End Module

Weitere Informationen und Beispiele finden Sie unter System.Threading.Timer.

Die System.Timers.Timer-Klasse

Ein weiterer Timer, der in einer Multithreadumgebung verwendet werden kann, ist System.Timers.Timer, der standardmäßig ein Ereignis in einem ThreadPool-Thread auslöst.

Wenn Sie ein System.Timers.Timer Objekt erstellen, können Sie das Zeitintervall angeben, in dem ein Elapsed Ereignis ausgelöst werden soll. Verwenden Sie die Enabled Eigenschaft, um anzugeben, ob ein Timer ein Elapsed Ereignis auslösen soll. Wenn ein Elapsed Ereignis nur einmal ausgelöst werden muss, nachdem das angegebene Intervall verstrichen ist, legen Sie den AutoReset Wert auf false fest. Der Standardwert der AutoReset Eigenschaft lautet true, was bedeutet, dass ein Elapsed Ereignis regelmäßig im durch die Interval Eigenschaft definierten Intervall ausgelöst wird.

Weitere Informationen und Beispiele finden Sie unter System.Timers.Timer.

Die System.Threading.PeriodicTimer-Klasse

Mit der System.Threading.PeriodicTimer Klasse können Sie auf einzelne Ticks eines angegebenen Intervalls warten und nach dem Aufruf von PeriodicTimer.WaitForNextTickAsync Arbeit ausführen.

Wenn Sie ein System.Threading.PeriodicTimer Objekt erstellen, geben Sie eine TimeSpan-Zeitspanne an, die die Zeitdauer zwischen den einzelnen Ticks des Timers bestimmt. Anstatt einen Rückruf zu übergeben oder einen Ereignishandler wie in den vorherigen Timerklassen festzulegen, erledigen Sie die Arbeit direkt im Geltungsbereich und warten darauf, dass WaitForNextTickAsync den Timer um das angegebene Intervall weiterführt.

Die WaitForNextTickAsync Methode gibt ein ValueTask<bool>; true beim erfolgreichen Auslösen des Timers und false beim Abbrechen des Timers durch Aufrufen PeriodicTimer.Disposezurück. WaitForNextTickAsync akzeptiert optional ein CancellationToken, was zu einem TaskCanceledException resultiert, wenn eine Stornierung angefordert wird.

Weitere Informationen finden Sie unter System.Threading.PeriodicTimer.

Siehe auch