Timer Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Generuje událost po nastaveném intervalu s možností generování opakovaných událostí.
public ref class Timer : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public class Timer : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
type Timer = class
inherit Component
interface ISupportInitialize
Public Class Timer
Inherits Component
Implements ISupportInitialize
- Dědičnost
- Implementuje
Příklady
Následující příklad vytvoří instanci objektu System.Timers.Timer
, který aktivuje svou Timer.Elapsed událost každé dvě sekundy (2 000 milisekund), nastaví obslužnou rutinu události pro událost a spustí časovač. Obslužná rutina události zobrazí hodnotu ElapsedEventArgs.SignalTime vlastnosti při každém jejím vyvolání.
using System;
using System.Timers;
public class Example
{
private static System.Timers.Timer aTimer;
public static void Main()
{
SetTimer();
Console.WriteLine("\nPress the Enter key to exit the application...\n");
Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
Console.ReadLine();
aTimer.Stop();
aTimer.Dispose();
Console.WriteLine("Terminating the application...");
}
private static void SetTimer()
{
// Create a timer with a two second interval.
aTimer = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime);
}
}
// The example displays output like the following:
// Press the Enter key to exit the application...
//
// The application started at 09:40:29.068
// The Elapsed event was raised at 09:40:31.084
// The Elapsed event was raised at 09:40:33.100
// The Elapsed event was raised at 09:40:35.100
// The Elapsed event was raised at 09:40:37.116
// The Elapsed event was raised at 09:40:39.116
// The Elapsed event was raised at 09:40:41.117
// The Elapsed event was raised at 09:40:43.132
// The Elapsed event was raised at 09:40:45.133
// The Elapsed event was raised at 09:40:47.148
//
// Terminating the application...
open System
open System.Timers
let onTimedEvent source (e: ElapsedEventArgs) =
printfn $"""The Elapsed event was raised at {e.SignalTime.ToString "HH:mm:ss.fff"}"""
// Create a timer with a two second interval.
let aTimer = new Timer 2000
// Hook up the Elapsed event for the timer.
aTimer.Elapsed.AddHandler onTimedEvent
aTimer.AutoReset <- true
aTimer.Enabled <- true
printfn "\nPress the Enter key to exit the application...\n"
printfn $"""The application started at {DateTime.Now.ToString "HH:mm:ss.fff"}"""
stdin.ReadLine() |> ignore
aTimer.Stop()
aTimer.Dispose()
printfn "Terminating the application..."
// The example displays output like the following:
// Press the Enter key to exit the application...
//
// The application started at 09:40:29.068
// The Elapsed event was raised at 09:40:31.084
// The Elapsed event was raised at 09:40:33.100
// The Elapsed event was raised at 09:40:35.100
// The Elapsed event was raised at 09:40:37.116
// The Elapsed event was raised at 09:40:39.116
// The Elapsed event was raised at 09:40:41.117
// The Elapsed event was raised at 09:40:43.132
// The Elapsed event was raised at 09:40:45.133
// The Elapsed event was raised at 09:40:47.148
//
// Terminating the application...
Imports System.Timers
Public Module Example
Private aTimer As System.Timers.Timer
Public Sub Main()
SetTimer()
Console.WriteLine("{0}Press the Enter key to exit the application...{0}",
vbCrLf)
Console.WriteLine("The application started at {0:HH:mm:ss.fff}",
DateTime.Now)
Console.ReadLine()
aTimer.Stop()
aTimer.Dispose()
Console.WriteLine("Terminating the application...")
End Sub
Private Sub SetTimer()
' Create a timer with a two second interval.
aTimer = New System.Timers.Timer(2000)
' Hook up the Elapsed event for the timer.
AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
aTimer.AutoReset = True
aTimer.Enabled = True
End Sub
' The event handler for the Timer.Elapsed event.
Private Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime)
End Sub
End Module
' The example displays output like the following:
' Press the Enter key to exit the application...
'
' The application started at 09:40:29.068
' The Elapsed event was raised at 09:40:31.084
' The Elapsed event was raised at 09:40:33.100
' The Elapsed event was raised at 09:40:35.100
' The Elapsed event was raised at 09:40:37.116
' The Elapsed event was raised at 09:40:39.116
' The Elapsed event was raised at 09:40:41.117
' The Elapsed event was raised at 09:40:43.132
' The Elapsed event was raised at 09:40:45.133
' The Elapsed event was raised at 09:40:47.148
'
' Terminating the application...
Poznámky
Komponenta Timer je serverový časovač, který vyvolá Elapsed událost ve vaší aplikaci po uplynutí počtu milisekund ve Interval vlastnosti. Objekt můžete nakonfigurovat tak, Timer aby vyvolal událost jen jednou nebo opakovaně pomocí AutoReset vlastnosti . Objekt Timer je obvykle deklarován na úrovni třídy tak, aby zůstal v oboru tak dlouho, dokud je potřeba. Pak můžete zpracovat jeho Elapsed událost a zajistit tak pravidelné zpracování. Předpokládejme například, že máte kritický server, který musí být spuštěný 24 hodin denně, 7 dní v týdnu. Můžete vytvořit službu, která pomocí objektu Timer pravidelně kontroluje server a zajišťuje, že je systém spuštěný. Pokud systém nereaguje, může se služba pokusit restartovat server nebo upozornit správce.
Důležité
Třída Timer není k dispozici pro všechny implementace a verze .NET, jako je .NET Standard 1.6 a nižší verze. V těchto případech můžete místo toho použít System.Threading.Timer třídu.
Tento typ implementuje IDisposable rozhraní. Po dokončení používání tohoto typu byste ho měli přímo nebo nepřímo odstranit. Pokud chcete odstranit typ přímo, zavolejte jeho Dispose metodu try
/catch
v bloku. Pokud ho chcete odstranit nepřímo, použijte konstruktor jazyka, například using
(v jazyce C#) nebo Using
(v jazyce Visual Basic). Další informace najdete v části "Použití objektu, který implementuje IDisposable" v IDisposable tématu rozhraní.
Serverová System.Timers.Timer třída je určena pro použití s pracovními vlákny v prostředí s více vlákny. Časovače serveru se můžou přesouvat mezi vlákny, aby zvládly vyvolanou Elapsed událost, což vede k větší přesnosti než časovače systému Windows při vyvolání události včas.
Komponenta System.Timers.Timer vyvolá Elapsed událost na základě hodnoty vlastnosti (v milisekundách).Interval Tuto událost můžete zpracovat, abyste mohli provést potřebné zpracování. Předpokládejme například, že máte online prodejní aplikaci, která průběžně publikuje prodejní objednávky do databáze. Služba, která kompiluje pokyny pro expedici, pracuje na dávce objednávek a nepracuje každou objednávku jednotlivě. Můžete použít k Timer zahájení dávkového zpracování každých 30 minut.
Důležité
System.Timers.Timer Třída má stejné rozlišení jako systémové hodiny. To znamená, že událost Elapsed se aktivuje v intervalu definovaném rozlišením systémových hodin, pokud Interval je vlastnost menší než rozlišení systémových hodin. Další informace najdete ve Interval vlastnosti.
Poznámka
Systémové hodiny, které se používají, jsou stejné jako getTickCount, které nejsou ovlivněny změnami provedenými pomocí timeBeginPeriod a timeEndPeriod.
Pokud AutoReset je nastavena na false
, System.Timers.Timer objekt vyvolá Elapsed událost pouze jednou po uplynutí první Interval . Pokud chcete pokračovat v pravidelném vyvolávání Elapsed události v intervalu definovaném parametrem Interval, nastavte AutoReset na true
hodnotu , což je výchozí hodnota.
Komponenta Timer zachytí a potlačí všechny výjimky vyvolané obslužnými rutinami událostí pro danou Elapsed událost. Toto chování se může změnit v budoucích verzích rozhraní .NET Framework. Všimněte si však, že to neplatí pro obslužné rutiny událostí, které se spouští asynchronně a zahrnují await
operátor (v jazyce C#) nebo Await
operátor (v jazyce Visual Basic). Výjimky vyvolané v těchto obslužných rutinách událostí se šíří zpět do volajícího vlákna, jak ukazuje následující příklad. Další informace o výjimkách vyvolaných asynchronními metodami najdete v tématu Zpracování výjimek.
using System;
using System.Threading.Tasks;
using System.Timers;
class Example
{
static void Main()
{
Timer timer = new Timer(1000);
timer.Elapsed += async ( sender, e ) => await HandleTimer();
timer.Start();
Console.Write("Press any key to exit... ");
Console.ReadKey();
}
private static Task HandleTimer()
{
Console.WriteLine("\nHandler not implemented..." );
throw new NotImplementedException();
}
}
// The example displays output like the following:
// Press any key to exit...
// Handler not implemented...
//
// Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
// at Example.HandleTimer()
// at Example.<<Main>b__0>d__2.MoveNext()
// --- End of stack trace from previous location where exception was thrown ---
// at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
// at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
// at System.Threading.ThreadPoolWorkQueue.Dispatch()
open System
open System.Threading.Tasks
open System.Timers
let handleTimer () =
printfn "\nHandler not implemented..."
raise (NotImplementedException()): Task
let timer = new Timer 1000
timer.Elapsed.AddHandler(fun sender e -> task { do! handleTimer () } |> ignore)
timer.Start()
printf "Press any key to exit... "
Console.ReadKey() |> ignore
// The example displays output like the following:
// Press any key to exit...
// Handler not implemented...
//
// Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
// at Example.HandleTimer()
// at Example.<<Main>b__0>d__2.MoveNext()
// --- End of stack trace from previous location where exception was thrown ---
// at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
// at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
// at System.Threading.ThreadPoolWorkQueue.Dispatch()
Imports System.Threading.Tasks
Imports System.Timers
Public Module Example
Public Sub Main()
Dim timer As New Timer(1000)
AddHandler timer.Elapsed, AddressOf Example.HandleTimer
'timer.Elapsed = Async ( sender, e ) => await HandleTimer()
timer.Start()
Console.Write("Press any key to exit... ")
Console.ReadKey()
End Sub
Private Async Sub HandleTimer(sender As Object, e As EventArgs)
Await Task.Run(Sub()
Console.WriteLine()
Console.WriteLine("Handler not implemented..." )
Throw New NotImplementedException()
End Sub)
End Sub
End Module
' The example displays output like the following:
' Press any key to exit...
' Handler not implemented...
'
' Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
' at Example._Lambda$__1()
' at System.Threading.Tasks.Task.Execute()
' --- End of stack trace from previous location where exception was thrown ---
' at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
' at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
' at Example.VB$StateMachine_0_HandleTimer.MoveNext()
' --- End of stack trace from previous location where exception was thrown ---
' at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
' at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
' at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
' at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
' at System.Threading.ThreadPoolWorkQueue.Dispatch()
Pokud je null
vlastnost , Elapsed událost je vyvolána ve vlákněThreadPool.SynchronizingObject Pokud zpracování Elapsed události trvá déle než Interval, může být událost vyvolána znovu v jiném ThreadPool vlákně. V takovém případě by měla být obslužná rutina události znovu zadána.
Poznámka
Metoda zpracování událostí může běžet na jednom vlákně současně s tím, že jiné vlákno volá metodu Stop nebo nastaví Enabled vlastnost na false
. To může mít za následek Elapsed vyvolání události po zastavení časovače. Ukázkový kód pro metodu Stop ukazuje jeden způsob, jak se této konfliktu časování vyhnout.
I když SynchronizingObject není null
, Elapsed mohou události nastat po Dispose volání metody nebo Stop po Enabled nastavení vlastnosti na false
, protože signál pro vyvolání Elapsed události je vždy zařazen do fronty pro spuštění ve vlákně fondu vláken. Jedním ze způsobů, jak tuto podmínku časování vyřešit, je nastavit příznak, který obslužné rutině Elapsed události řekne, aby následující události ignorovala.
Pokud použijete System.Timers.Timer třídu s elementem uživatelského rozhraní, jako je formulář nebo ovládací prvek, aniž byste umístili časovač na tento prvek uživatelského rozhraní, přiřaďte formulář nebo ovládací prvek, který obsahuje SynchronizingObjectTimer vlastnost, aby událost byla zařazována do vlákna uživatelského rozhraní.
Seznam výchozích hodnot vlastností pro instanci Timernástroje najdete v konstruktoru Timer .
Tip
.NET obsahuje čtyři třídy s názvem Timer
, z nichž každá nabízí různé funkce:
- System.Timers.Timer (toto téma): aktivuje událost v pravidelných intervalech. Třída je určena pro použití jako serverová nebo součást služby v prostředí s více vlákny; nemá žádné uživatelské rozhraní a není viditelný za běhu.
- System.Threading.Timer: v pravidelných intervalech spouští jednu metodu zpětného volání ve vlákně fondu vláken. Metoda zpětného volání je definována při vytvoření instance časovače a nelze ji změnit. System.Timers.Timer Stejně jako třída je tato třída určená pro použití jako serverová komponenta nebo součást služby v prostředí s více vlákny; nemá žádné uživatelské rozhraní a není viditelná za běhu.
- System.Windows.Forms.Timer: model Windows Forms komponenta, která v pravidelných intervalech aktivuje událost. Komponenta nemá žádné uživatelské rozhraní a je navržená pro použití v jednovláknovém prostředí.
- System.Web.UI.Timer (Pouze rozhraní .NET Framework): ASP.NET komponenta, která provádí asynchronní nebo synchronní zpětné odkazy webových stránek v pravidelném intervalu.
Konstruktory
Timer() |
Inicializuje novou instanci Timer třídy a nastaví všechny vlastnosti na jejich počáteční hodnoty. |
Timer(Double) |
Inicializuje novou instanci Timer třídy a nastaví Interval vlastnost na zadaný počet milisekund. |
Timer(TimeSpan) |
Inicializuje novou instanci Timer třídy a nastaví Interval vlastnost na zadané období. |
Vlastnosti
AutoReset |
Získá nebo nastaví logickou hodnotu označující, zda Timer má událost vyvolat Elapsed pouze jednou ( |
CanRaiseEvents |
Získá hodnotu označující, zda komponenta může vyvolat událost. (Zděděno od Component) |
Container |
Získá objekt IContainer , který obsahuje Component. (Zděděno od Component) |
DesignMode |
Získá hodnotu, která označuje, zda je aktuálně v režimu návrhu Component . (Zděděno od Component) |
Enabled |
Získá nebo nastaví hodnotu označující, zda Timer má vyvolat Elapsed událost. |
Events |
Získá seznam obslužných rutin událostí, které jsou připojeny k tomuto Component. (Zděděno od Component) |
Interval |
Získá nebo nastaví interval vyjádřený v milisekundách, ve kterém vyvolá Elapsed událost. |
Site |
Získá nebo nastaví web, který sváže kontejner v režimu návrhu Timer . |
SynchronizingObject |
Získá nebo nastaví objekt použitý k zařazování volání obslužné rutiny událostí, které jsou vydány po uplynutí intervalu. |
Metody
BeginInit() |
Zahájí inicializaci za běhu objektu Timer , který se používá ve formuláři nebo v jiné komponentě. |
Close() |
Uvolní prostředky používané nástrojem Timer. |
CreateObjRef(Type) |
Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy používaného ke komunikaci se vzdáleným objektem. (Zděděno od MarshalByRefObject) |
Dispose() |
Uvolní všechny prostředky používané nástrojem Component. (Zděděno od Component) |
Dispose(Boolean) |
Uvolní všechny prostředky používané aktuálním Timernástrojem . |
EndInit() |
Ukončí inicializaci za běhu objektu Timer , který se používá ve formuláři nebo jiné komponentě. |
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetLifetimeService() |
Zastaralé.
Načte objekt služby aktuální životnosti, který řídí zásady životnosti pro tuto instanci. (Zděděno od MarshalByRefObject) |
GetService(Type) |
Vrátí objekt, který představuje službu poskytovanou objektem Component nebo jejím Containerobjektem . (Zděděno od Component) |
GetType() |
Získá aktuální Type instanci. (Zděděno od Object) |
InitializeLifetimeService() |
Zastaralé.
Získá objekt služby životnosti, který řídí zásady životnosti pro tuto instanci. (Zděděno od MarshalByRefObject) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
MemberwiseClone(Boolean) |
Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu. (Zděděno od MarshalByRefObject) |
Start() |
Zahájí vyvolání Elapsed události nastavením Enabled na |
Stop() |
Zastaví vyvolání Elapsed události nastavením Enabled na |
ToString() |
String Vrátí hodnotu obsahující název Component, pokud existuje. Tato metoda by neměla být přepsána. (Zděděno od Component) |
Událost
Disposed |
Nastane, když je komponenta odstraněna voláním Dispose() metody. (Zděděno od Component) |
Elapsed |
Nastane při uplynutí intervalu. |
Platí pro
Bezpečný přístup z více vláken
Všechny veřejné static
členy tohoto typu jsou bezpečné z více vláken. U členů instancí není zaručena bezpečnost pro přístup z více vláken.