TimerTimers

.NET stellt zwei Timer zur Verfügung, die in einer Multithreadumgebung verwendet werden können:.NET provides two timers to use in a multithreaded environment:

Hinweis

Einige .NET-Implementierungen können zusätzliche Timer enthalten:Some .NET implementations may include additional timers:

  • System.Windows.Forms.Timer: eine Windows Forms-Komponente, die in regelmäßigen Abständen ein Ereignis auslöst.System.Windows.Forms.Timer: a Windows Forms component that fires an event at regular intervals. Die Komponente besitzt keine Benutzeroberfläche und wurde für die Verwendung in einer Singlethreadumgebung entwickelt.The component has no user interface and is designed for use in a single-threaded environment.
  • System.Web.UI.Timer: eine ASP.NET-Komponente, die asynchrone oder synchrone Webseitenpostbacks in regelmäßigen Intervallen ausführt.System.Web.UI.Timer: an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.
  • System.Windows.Threading.DispatcherTimer: ein Timer, der in die Dispatcher-Warteschlange integriert ist. Diese wird in einem festgelegten Zeitintervall und mit einer festgelegten Priorität verarbeitet.System.Windows.Threading.DispatcherTimer: a timer that is integrated into the Dispatcher queue which is processed at a specified interval of time and at a specified priority.

Die System.Threading.Timer-KlasseThe System.Threading.Timer class

Mithilfe der System.Threading.Timer-Klasse können Sie einen Delegaten kontinuierlich in bestimmten Zeitintervallen aufrufen.The System.Threading.Timer class enables you to continuously call a delegate at specified time intervals. Sie können diese Klasse ebenfalls verwenden, um einen einzelnen Aufruf eines Delegaten in einem bestimmten Zeitintervall zu planen.You also can use this class to schedule a single call to a delegate in a specified time interval. Der Delegat wird in einem ThreadPool-Thread ausgeführt.The delegate is executed on a ThreadPool thread.

Wenn Sie ein System.Threading.Timer-Objekt erstellen, geben Sie einen TimerCallback-Delegaten an, der die Callbackmethode definiert, ein optionales Zustandsobjekt, das an die Callbackmethode übergeben wird, die Verzögerung vor dem ersten Aufruf der Callbackmethode und das Zeitintervall zwischen den Aufrufen der Callbackmethode.When you create a System.Threading.Timer object, you specify a TimerCallback delegate that defines the callback method, an optional state object that is passed to the callback, the amount of time to delay before the first invocation of the callback, and the time interval between callback invocations. Wenn Sie einen anstehenden Timer löschen möchten, rufen Sie die Timer.Dispose-Methode auf.To cancel a pending timer, call the Timer.Dispose method.

Im folgenden Beispiel wird ein Timer erstellt, der den bereitgestellten Delegaten zum ersten Mal nach einer Sekunde (1000 Millisekunden) und dann alle zwei Sekunden aufruft.The following example creates a timer that calls the provided delegate for the first time after one second (1000 milliseconds) and then calls it every two seconds. Das Zustandsobjekt im Beispiel wird verwendet, um die Häufigkeit der Aufrufe des Delegaten zu zählen.The state object in the example is used to count how many times the delegate is called. Der Timer wird beendet, wenn der Delegat mindestens zehnmal aufgerufen wurde.The timer is stopped when the delegate has been called at least 10 times.

using namespace System;
using namespace System::Threading;

ref class TimerState
{
public:
    int counter;
};

ref class Example
{
private:
    static Timer^ timer;

public:
    static void TimerTask(Object^ state)
    {
        Console::WriteLine("{0:HH:mm:ss.fff}: starting a new callback.", DateTime::Now);

        TimerState^ timerState = dynamic_cast<TimerState^>(state);
        Interlocked::Increment(timerState->counter);
    }

    static void Main()
    {
        TimerCallback^ tcb = gcnew TimerCallback(&TimerTask);
        TimerState^ state = gcnew TimerState();
        state->counter = 0;
        timer = gcnew Timer(tcb, state, 1000, 2000);

        while (state->counter <= 10)
        {
            Thread::Sleep(1000);
        }

        timer->~Timer();
        Console::WriteLine("{0:HH:mm:ss.fff}: done.", DateTime::Now);
    }
};

int main()
{
    Example::Main();
}
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.For more information and examples, see System.Threading.Timer.

Die System.Timers.Timer-KlasseThe System.Timers.Timer class

Ein weiterer Timer, der in einer Multithreadumgebung verwendet werden kann, ist System.Timers.Timer. Dieser löst standardmäßig ein Ereignis in einem ThreadPool-Thread aus.Another timer that can be used in a multithreaded environment is System.Timers.Timer that by default raises an event on a ThreadPool thread.

Wenn Sie ein System.Timers.Timer-Objekt erstellen, können Sie das Zeitintervall angeben, in dem ein Elapsed-Ereignis ausgelöst werden soll.When you create a System.Timers.Timer object, you may specify the time interval in which to raise an Elapsed event. Verwenden Sie die Enabled-Eigenschaft, um anzugeben, ob ein Timer ein Elapsed-Ereignis auslösen soll.Use the Enabled property to indicate if a timer should raise an Elapsed event. Wenn ein Elapsed-Event nur ausgelöst werden soll, nachdem das angegebene Intervall verstrichen ist, legen Sie AutoReset auf false fest.If you need an Elapsed event to be raised only once after the specified interval has elapsed, set the AutoReset to false. Der Standardwert der AutoReset-Eigenschaft ist true. Das bedeutet, dass ein Elapsed-Ereignis regelmäßig in dem von der Interval-Eigenschaft angegebenen Intervall ausgelöst wird.The default value of the AutoReset property is true, which means that an Elapsed event is raised regularly at the interval defined by the Interval property.

Weitere Informationen und Beispiele finden Sie unter System.Timers.Timer.For more information and examples, see System.Timers.Timer.

Siehe auchSee also