Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
.NET bietet drei Zeitgeber für die Verwendung in einer Multithread-Umgebung:
- System.Threading.Timer, die eine einzelne Rückrufmethode für einen ThreadPool Thread in regelmäßigen Abständen ausführt.
- System.Timers.Timer, das standardmäßig ein Ereignis in einem ThreadPool Thread in regelmäßigen Abständen auslöst.
- System.Threading.PeriodicTimer, mit dem der Aufrufer, nachdem auf einzelne Ticks des Timers gewartet wurde, Arbeit ausführen kann.
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.