Timer Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Genereert een gebeurtenis na een ingestelde interval, met een optie om terugkerende gebeurtenissen te genereren.
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
- Overname
- Implementeringen
Voorbeelden
In het volgende voorbeeld wordt een System.Timers.Timer object geïnstitueerd dat Timer.Elapsed de gebeurtenis om de twee seconden (2000 milliseconden) wordt geactiveerd, een gebeurtenis-handler voor de gebeurtenis wordt ingesteld en de timer wordt gestart. De gebeurtenis-handler geeft de waarde van de ElapsedEventArgs.SignalTime eigenschap weer telkens wanneer deze wordt gegenereerd.
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...
Opmerkingen
Het Timer onderdeel is een servertimer die een Elapsed gebeurtenis in uw toepassing genereert nadat het aantal milliseconden in de Interval eigenschap is verstreken. U kunt het Timer object zo configureren dat de gebeurtenis slechts eenmaal of herhaaldelijk wordt gegenereerd met behulp van de AutoReset eigenschap. Normaal gesproken wordt een Timer object gedeclareerd op klasseniveau, zodat het binnen het bereik blijft zolang het nodig is. Vervolgens kunt u de Elapsed gebeurtenis afhandelen om regelmatige verwerking te bieden. Stel dat u een kritieke server hebt die 24 uur per dag, 7 dagen per week moet worden uitgevoerd. U kunt een service maken die gebruikmaakt van een Timer object om de server periodiek te controleren en ervoor te zorgen dat het systeem actief is. Als het systeem niet reageert, kan de service proberen de server opnieuw op te starten of een beheerder op de hoogte stellen.
Important
De klasse Timer is niet beschikbaar voor alle .NET implementaties en versies, zoals .NET Standard 1.6 en lagere versies. In dergelijke gevallen kunt u in plaats daarvan de System.Threading.Timer klasse gebruiken.
Met dit type wordt de IDisposable interface geïmplementeerd. Wanneer u klaar bent met het gebruik van het type, moet u het direct of indirect verwijderen. Als u het type rechtstreeks wilt verwijderen, roept u de Dispose methode aan in een try/catch blok. Als u deze indirect wilt verwijderen, gebruikt u een taalconstructie zoals using (in C#) of Using (in Visual Basic). Zie de sectie 'Using an Object that Implements IDisposable' (Een object gebruiken dat IDisposable implementeert) in het IDisposable interfaceonderwerp voor meer informatie.
De serverklasse System.Timers.Timer is ontworpen voor gebruik met werkthreads in een omgeving met meerdere threads. Servertimers kunnen tussen threads schakelen om de gegenereerde Elapsed gebeurtenis af te handelen, wat resulteert in meer nauwkeurigheid dan Windows timers bij het op tijd genereren van de gebeurtenis.
Het System.Timers.Timer onderdeel genereert de Elapsed gebeurtenis op basis van de waarde (in milliseconden) van de Interval eigenschap. U kunt deze gebeurtenis afhandelen om de verwerking uit te voeren die u nodig hebt. Stel dat u een onlineverkooptoepassing hebt die continu verkooporders plaatst in een database. De service die de instructies voor verzending compileert, werkt op een batch orders in plaats van elke bestelling afzonderlijk te verwerken. U kunt een Timer batchverwerking elke 30 minuten starten.
Important
De klasse System.Timers.Timer heeft dezelfde resolutie als de systeemklok. Dit betekent dat de Elapsed gebeurtenis wordt geactiveerd met een interval dat is gedefinieerd door de resolutie van de systeemklok als de Interval eigenschap kleiner is dan de resolutie van de systeemklok. Voor meer informatie, zie de eigenschap Interval.
Note
De systeemklok die wordt gebruikt, is dezelfde klok die wordt gebruikt door GetTickCount, die niet wordt beïnvloed door wijzigingen die zijn aangebracht met timeBeginPeriod en timeEndPeriod.
Wanneer AutoReset dit is ingesteldfalse, wordt de Elapsed gebeurtenis slechts eenmaal gegenereerd door een System.Timers.Timer object, nadat de eerste Interval is verstreken. Als u de Elapsed gebeurtenis regelmatig wilt verhogen met het interval dat is gedefinieerd door de Interval, ingesteld AutoReset op true, wat de standaardwaarde is.
Het Timer onderdeel onderschept en onderdrukt alle uitzonderingen die worden gegenereerd door gebeurtenis-handlers voor de Elapsed gebeurtenis. Dit gedrag is onderhevig aan wijzigingen in toekomstige releases van het .NET Framework. Houd er echter rekening mee dat dit niet geldt voor gebeurtenis-handlers die asynchroon worden uitgevoerd en de operator await (in C#) of de operator Await (in Visual Basic) bevatten. Uitzonderingen die in deze gebeurtenis-handlers worden gegenereerd, worden weer doorgegeven aan de aanroepende thread, zoals in het volgende voorbeeld wordt geïllustreerd. Zie Uitzonderingsafhandeling voor meer informatie over uitzonderingen die zijn gegenereerd in asynchrone methoden.
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()
Als de SynchronizingObject eigenschap is null, wordt de Elapsed gebeurtenis gegenereerd op een ThreadPool thread. Als de verwerking van de Elapsed gebeurtenis langer duurt dan Interval, kan de gebeurtenis opnieuw worden gegenereerd op een andere ThreadPool thread. In deze situatie moet de gebeurtenis-handler opnieuw worden ingetekend.
Note
De methode voor gebeurtenisafhandeling kan tegelijkertijd op één thread worden uitgevoerd wanneer een andere thread de Stop methode aanroept of de Enabled eigenschap instelt op false. Dit kan ertoe leiden dat de Elapsed gebeurtenis wordt gegenereerd nadat de timer is gestopt. In de voorbeeldcode voor de Stop methode ziet u één manier om deze racevoorwaarde te voorkomen.
Zelfs als SynchronizingObject dat niet nullhet geval is, Elapsed kunnen gebeurtenissen optreden nadat de Dispose of Stop methode is aangeroepen of nadat de Enabled eigenschap is ingesteld falseop , omdat het signaal voor het genereren van de gebeurtenis altijd in de Elapsed wachtrij wordt geplaatst voor uitvoering op een threadpoolthread. Een manier om deze racevoorwaarde op te lossen, is door een vlag in te stellen waarmee de gebeurtenis-handler voor de Elapsed gebeurtenis de volgende gebeurtenissen negeert.
Als u de klasse gebruikt met een element van de System.Timers.Timer gebruikersinterface, zoals een formulier of besturingselement, zonder de timer op dat element van de gebruikersinterface te plaatsen, wijst u het formulier of besturingselement toe dat de TimerSynchronizingObject eigenschap bevat, zodat de gebeurtenis aan de gebruikersinterfacethread wordt gekoppeld.
Zie de Timer constructor voor een lijst met standaardeigenschapswaarden voor een exemplaar vanTimer.
Tip
.NET bevat vier klassen met de naam Timer, die elk verschillende functionaliteit bieden:
- System.Timers.Timer (dit onderwerp): een gebeurtenis wordt regelmatig geactiveerd. De klasse is bedoeld voor gebruik als een server- of serviceonderdeel in een omgeving met meerderereads; het heeft geen gebruikersinterface en is niet zichtbaar tijdens runtime.
- System.Threading.Timer: voert met regelmatige tussenpozen één callback-methode uit op een threadgroepthread. De callback-methode wordt gedefinieerd wanneer de timer wordt geïnstantieerd en niet kan worden gewijzigd. Net als de System.Timers.Timer klasse is deze klasse bedoeld voor gebruik als een server- of serviceonderdeel in een omgeving met meerderereads. Deze klasse heeft geen gebruikersinterface en is tijdens runtime niet zichtbaar.
- System.Windows.Forms.Timer: een Windows Forms-onderdeel waarmee een gebeurtenis regelmatig wordt geactiveerd. Het onderdeel heeft geen gebruikersinterface en is ontworpen voor gebruik in een omgeving met één thread.
- System.Web.UI.Timer (alleen .NET Framework): een ASP.NET-onderdeel waarmee asynchrone of synchrone postbacks op webpagina's met een regelmatig interval worden uitgevoerd.
Constructors
| Name | Description |
|---|---|
| Timer() |
Initialiseert een nieuw exemplaar van de Timer klasse en stelt alle eigenschappen in op de oorspronkelijke waarden. |
| Timer(Double) |
Initialiseert een nieuw exemplaar van de Timer klasse en stelt de Interval eigenschap in op het opgegeven aantal milliseconden. |
Eigenschappen
| Name | Description |
|---|---|
| AutoReset |
Hiermee haalt u een Booleaanse waarde op die aangeeft of de ElapsedTimer gebeurtenis slechts eenmaal () of herhaaldelijk ( |
| CanRaiseEvents |
Hiermee wordt een waarde opgehaald die aangeeft of het onderdeel een gebeurtenis kan genereren. (Overgenomen van Component) |
| Container |
Hiermee haalt u het IContainer bestand op dat de Component. (Overgenomen van Component) |
| DesignMode |
Hiermee wordt een waarde opgehaald die aangeeft of de Component momenteel in de ontwerpmodus is. (Overgenomen van Component) |
| Enabled |
Hiermee wordt een waarde opgehaald of ingesteld die aangeeft of de TimerElapsed gebeurtenis moet worden gegenereerd. |
| Events |
Hiermee haalt u de lijst met gebeurtenis-handlers op die aan dit Componentbestand zijn gekoppeld. (Overgenomen van Component) |
| Interval |
Hiermee wordt het interval opgehaald of ingesteld, uitgedrukt in milliseconden, waarmee de Elapsed gebeurtenis moet worden gegenereerd. |
| Site |
Hiermee haalt u de site op die de container koppelt aan de Timer container in de ontwerpmodus. |
| SynchronizingObject |
Hiermee haalt u het object op dat wordt gebruikt voor marshal event-handler-aanroepen die worden uitgegeven wanneer een interval is verstreken. |
Methoden
| Name | Description |
|---|---|
| BeginInit() |
Hiermee begint u de runtime-initialisatie van een Timer die wordt gebruikt op een formulier of door een ander onderdeel. |
| Close() |
Releases van de resources die worden gebruikt door de Timer. |
| CreateObjRef(Type) |
Hiermee maakt u een object dat alle relevante informatie bevat die nodig is om een proxy te genereren die wordt gebruikt om te communiceren met een extern object. (Overgenomen van MarshalByRefObject) |
| Dispose() |
Alle resources die worden gebruikt door de Component. (Overgenomen van Component) |
| Dispose(Boolean) |
Geeft alle resources vrij die worden gebruikt door de huidige Timer. |
| EndInit() |
Hiermee beëindigt u de runtime-initialisatie van een Timer formulier of een ander onderdeel. |
| Equals(Object) |
Bepaalt of het opgegeven object gelijk is aan het huidige object. (Overgenomen van Object) |
| GetHashCode() |
Fungeert als de standaardhashfunctie. (Overgenomen van Object) |
| GetLifetimeService() |
Hiermee haalt u het huidige levensduurserviceobject op waarmee het levensduurbeleid voor dit exemplaar wordt beheerd. (Overgenomen van MarshalByRefObject) |
| GetService(Type) |
Hiermee wordt een object geretourneerd dat een service vertegenwoordigt die wordt geleverd door of door de Component service Container. (Overgenomen van Component) |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| InitializeLifetimeService() |
Hiermee haalt u een levensduurserviceobject op om het levensduurbeleid voor dit exemplaar te beheren. (Overgenomen van MarshalByRefObject) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| MemberwiseClone(Boolean) |
Hiermee maakt u een ondiepe kopie van het huidige MarshalByRefObject object. (Overgenomen van MarshalByRefObject) |
| Start() |
Hiermee wordt de gebeurtenis gestart door de Elapsed instelling in te stellen Enabled op |
| Stop() |
Stopt met het genereren van de gebeurtenis door de Elapsed instelling in te stellen Enabled op |
| ToString() |
Retourneert een String met de naam van de Component, indien van toepassing. Deze methode mag niet worden overschreven. (Overgenomen van Component) |
gebeurtenis
| Name | Description |
|---|---|
| Disposed |
Treedt op wanneer het onderdeel wordt verwijderd door een aanroep naar de Dispose() methode. (Overgenomen van Component) |
| Elapsed |
Treedt op wanneer het interval is verstreken. |
Van toepassing op
Veiligheid thread
static Openbare leden van dit type zijn thread-veilig. Exemplaarleden zijn niet gegarandeerd thread-safe.