Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
.NET poskytuje tři časovače pro použití v prostředí s více vlákny:
- System.Threading.Timer, který provádí jednu metodu zpětného volání ve vlákně ThreadPool v pravidelných intervalech.
- System.Timers.Timer, což ve výchozím nastavení vyvolává událost ve vlákně ThreadPool v pravidelných intervalech.
- System.Threading.PeriodicTimer, což volajícímu umožňuje provádět práci po čekání na jednotlivé značky časovače.
Poznámka:
Některé implementace .NET můžou zahrnovat další časovače:
- System.Windows.Forms.Timer: Komponenta Modelu Windows Forms, která aktivuje událost v pravidelných intervalech. Komponenta nemá žádné uživatelské rozhraní a je navržená pro použití v prostředí s jedním vláknem.
- System.Web.UI.Timer: komponenta ASP.NET, která provádí asynchronní nebo synchronní postbacky webových stránek v pravidelných intervalech.
- System.Windows.Threading.DispatcherTimer: časovač integrovaný do Dispatcher fronty, který se zpracovává v zadaném časovém intervalu a v zadané prioritě.
Třída System.Threading.Timer
Třída System.Threading.Timer umožňuje nepřetržitě volat delegáta v zadaných časových intervalech. Tuto třídu můžete také použít k naplánování jednoho volání delegáta v zadaném časovém intervalu. Delegát se spustí ve vlákně ThreadPool.
Při vytváření objektu System.Threading.Timer zadáte delegáta TimerCallback , který definuje metodu zpětného volání, volitelný stavový objekt, který se předá zpětnému volání, dobu, po kterou se má zpoždění před prvním vyvoláním zpětného volání, a časový interval mezi voláním zpětného volání. Chcete-li zrušit čekající časovač, zavolejte metodu Timer.Dispose .
Následující příklad vytvoří časovač, který volá poskytnutého delegáta poprvé po jedné sekundě (1000 milisekund) a potom ji volá každých dvě sekundy. Objekt stavu v příkladu slouží k počítání, kolikrát je delegát volán. Časovač se zastaví, když byl delegát volán nejméně 10krát.
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
Další informace a příklady naleznete v tématu System.Threading.Timer.
Třída System.Timers.Timer
Dalším časovačem, který lze použít v prostředí s více vlákny, je System.Timers.Timer, který ve výchozím nastavení vyvolá událost na vlákně ThreadPool.
Při vytváření objektu System.Timers.Timer můžete určit časový interval, ve kterém se má Elapsed vyvolat událost.
Enabled Pomocí vlastnosti můžete určit, jestli má časovač vyvolat Elapsed událost. Pokud potřebujete, Elapsed aby byla událost vyvolána pouze jednou po uplynutí zadaného intervalu AutoReset , nastavte hodnotu false
. Výchozí hodnota AutoReset vlastnosti je true
, což znamená, že Elapsed událost je pravidelně vyvolána v intervalu definovaném Interval vlastností.
Další informace a příklady naleznete v tématu System.Timers.Timer.
Třída System.Threading.PeriodicTimer
Třída System.Threading.PeriodicTimer umožňuje čekat na jednotlivé tiky zadaného intervalu a provádět práci po zavolání PeriodicTimer.WaitForNextTickAsync.
Při vytváření objektu System.Threading.PeriodicTimer zadáte TimeSpan , který určuje dobu mezi jednotlivými záškrty časovače. Místo předání zpětného volání nebo nastavení obslužné rutiny události jako v předchozích třídách časovače, práci provádíte přímo v rámci a čekáte WaitForNextTickAsync na posun časovače podle zadaného intervalu.
Metoda WaitForNextTickAsync vrátí ValueTask<bool>
; true
po úspěšném spuštění časovače a false
kdy časovač byl zrušen voláním PeriodicTimer.Dispose.
WaitForNextTickAsync volitelně přijímá CancellationToken, což vede k TaskCanceledException když je požadováno zrušení.
Další informace najdete v tématu System.Threading.PeriodicTimer.