Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Platforma .NET udostępnia trzy czasomierze do użycia w środowisku wielowątkowym:
- System.Threading.Timer, który wykonuje pojedynczą metodę wywołania zwrotnego w wątku ThreadPool w regularnych odstępach czasu.
- System.Timers.Timer, który domyślnie zgłasza zdarzenie w wątku ThreadPool w regularnych odstępach czasu.
- System.Threading.PeriodicTimer, dzięki czemu obiekt wywołujący może wykonać pracę po oczekiwaniu na poszczególne znaczniki czasomierza.
Uwaga / Notatka
Niektóre implementacje platformy .NET mogą obejmować dodatkowe czasomierze:
- System.Windows.Forms.Timer: składnik Windows Forms, który uruchamia zdarzenie w regularnych odstępach czasu. Składnik nie ma interfejsu użytkownika i jest przeznaczony do użytku w środowisku jednowątkowym.
- System.Web.UI.Timer: składnik ASP.NET, który wykonuje asynchroniczne lub synchroniczne żądania zwrotne stron internetowych w regularnych odstępach czasu.
- System.Windows.Threading.DispatcherTimer: czasomierz zintegrowany z kolejką Dispatcher , który jest przetwarzany w określonym przedziale czasu i o określonym priorytetzie.
Klasa System.Threading.Timer
Klasa System.Threading.Timer umożliwia ciągłe wywoływanie delegata w określonych interwałach czasu. Tej klasy można również użyć do zaplanowania pojedynczego wywołania delegata w określonym przedziale czasu. Delegat jest wykonywany na wątku ThreadPool.
Podczas tworzenia System.Threading.Timer obiektu można określić TimerCallback delegata definiującego metodę wywołania zwrotnego, opcjonalny obiekt stanu przekazywany do wywołania zwrotnego, czas opóźnienia przed pierwszym wywołaniem zwrotnym oraz przedział czasu między wywołaniami zwrotnymi. Aby anulować oczekujący czasomierz, wywołaj metodę Timer.Dispose .
Poniższy przykład tworzy czasomierz, który wywołuje dostarczonego delegata po raz pierwszy po jednej sekundzie (1000 milisekund), a następnie wywołuje go co dwie sekundy. W przykładzie obiekt stanu jest używany do zliczenia, ile razy delegat został wywołany. Czasomierz jest zatrzymywany, gdy delegat został wywołany co najmniej 10 razy.
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
Aby uzyskać więcej informacji i przykładów, zobacz System.Threading.Timer.
Klasa System.Timers.Timer
Inny timer, który może być używany w środowisku wielowątkowym, to System.Timers.Timer, który domyślnie wywołuje zdarzenie na wątku ThreadPool.
Podczas tworzenia obiektu System.Timers.Timer można określić interwał czasu, w którym zdarzenie Elapsed ma zostać uruchomione. Użyj właściwości Enabled, aby wskazać, czy czasomierz powinien wywołać zdarzenie Elapsed. Jeśli potrzebujesz, aby zdarzenie Elapsed było zgłaszane tylko raz po upływie określonego interwału, ustaw AutoReset na false
. Wartość domyślna właściwości AutoReset to true
, co oznacza, że zdarzenie Elapsed jest regularnie wywoływane w przedziale czasowym zdefiniowanym przez właściwość Interval.
Aby uzyskać więcej informacji i przykładów, zobacz System.Timers.Timer.
Klasa System.Threading.PeriodicTimer
Klasa System.Threading.PeriodicTimer umożliwia oczekiwanie na poszczególne znaczniki określonego interwału, wykonując pracę po wywołaniu metody PeriodicTimer.WaitForNextTickAsync.
Podczas tworzenia System.Threading.PeriodicTimer obiektu należy określić TimeSpan, który określa czas trwania pomiędzy tyknięciami zegara. Zamiast przekazywać wywołanie zwrotne lub ustawiać program obsługi zdarzeń, jak w poprzednich klasach czasomierza, wykonujesz pracę bezpośrednio w lokalnym zasięgu, oczekując WaitForNextTickAsync, aby czasomierz przesunął się o określony interwał.
Metoda WaitForNextTickAsync zwraca ValueTask<bool>
; true
po pomyślnym uruchomieniu czasomierza i false
po anulowaniu czasomierza przez wywołanie PeriodicTimer.Dispose.
WaitForNextTickAsync opcjonalnie akceptuje CancellationToken, co skutkuje TaskCanceledException w przypadku żądania anulowania.
Aby uzyskać więcej informacji, zobacz System.Threading.PeriodicTimer.