Timer Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Genererar en händelse efter ett angivet intervall med ett alternativ för att generera återkommande händelser.
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
- Arv
- Implementeringar
Exempel
I följande exempel instansierar ett System.Timers.Timer objekt som utlöser händelsen Timer.Elapsed varannan sekund (2 000 millisekunder), konfigurerar en händelsehanterare för händelsen och startar timern. Händelsehanteraren visar värdet för egenskapen varje gång den ElapsedEventArgs.SignalTime utlöses.
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...
Kommentarer
Komponenten Timer är en serverbaserad timer som genererar en Elapsed händelse i ditt program efter att antalet millisekunder i Interval egenskapen har förflutit. Du kan konfigurera objektet Timer så att det bara genererar händelsen en gång eller flera gånger med hjälp av AutoReset egenskapen . Vanligtvis deklareras ett Timer objekt på klassnivå så att det förblir i omfånget så länge det behövs. Du kan sedan hantera händelsen Elapsed för att tillhandahålla regelbunden bearbetning. Anta till exempel att du har en kritisk server som måste köras 24 timmar om dygnet, 7 dagar i veckan. Du kan skapa en tjänst som använder ett Timer objekt för att regelbundet kontrollera servern och se till att systemet är igång. Om systemet inte svarar kan tjänsten försöka starta om servern eller meddela en administratör.
Important
Klassen Timer är inte tillgänglig för alla .NET-implementeringar och versioner, till exempel .NET Standard 1.6 och lägre versioner. I dessa fall kan du använda System.Threading.Timer klassen i stället.
Den här typen implementerar IDisposable gränssnittet. När du har använt typen bör du kassera den på ett direkt eller indirekt sätt. Om du vill ta bort typen direkt anropar du dess Dispose metod i ett try/catch block. Om du vill ta bort det indirekt använder du en språkkonstruktion som using (i C#) eller Using (i Visual Basic). Mer information finns i avsnittet "Använda ett objekt som implementerar IDisposable" i IDisposable gränssnittet.
Den serverbaserade System.Timers.Timer klassen är utformad för användning med arbetstrådar i en flertrådad miljö. Servertimers kan flyttas mellan trådar för att hantera den upphöjda Elapsed händelsen, vilket resulterar i mer noggrannhet än Windows timers för att höja händelsen i tid.
Komponenten System.Timers.Timer genererar Elapsed händelsen baserat på värdet (i millisekunder) för Interval egenskapen. Du kan hantera den här händelsen för att utföra den bearbetning du behöver. Anta till exempel att du har ett onlineförsäljningsprogram som kontinuerligt publicerar försäljningsorder till en databas. Tjänsten som sammanställer instruktionerna för leverans fungerar på en batch med beställningar i stället för att bearbeta varje beställning individuellt. Du kan använda en Timer för att starta batchbearbetningen var 30:e minut.
Important
Klassen System.Timers.Timer har samma upplösning som systemklockan. Det innebär att Elapsed händelsen utlöses med ett intervall som definieras av systemklockans upplösning om Interval egenskapen är mindre än systemklockans upplösning. För mer information, se egenskapen Interval.
Note
Systemklockan som används är samma klocka som används av GetTickCount, som inte påverkas av ändringar som gjorts med timeBeginPeriod och timeEndPeriod.
När AutoReset är inställt på falsegenererar System.Timers.Timer ett Elapsed objekt händelsen bara en gång, efter att den första Interval har förflutit. Om du vill fortsätta att höja Elapsed händelsen regelbundet med det intervall som definieras av Interval, anger du AutoReset till true, vilket är standardvärdet.
Komponenten Timer fångar upp och undertrycker alla undantag som genereras av händelsehanterare för Elapsed händelsen. Det här beteendet kan komma att ändras i framtida versioner av .NET Framework. Observera dock att detta inte gäller för händelsehanterare som kör asynkront och inkluderar operatorn await (i C#) eller operatorn Await (i Visual Basic). Undantag som genereras i dessa händelsehanterare sprids tillbaka till den anropande tråden, vilket visas i följande exempel. Mer information om undantag som genereras i asynkrona metoder finns i Undantagshantering.
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()
Om egenskapen SynchronizingObject är nullgenereras Elapsed händelsen i en ThreadPool tråd. Om bearbetningen Elapsed av händelsen varar längre än Intervalkan händelsen aktiveras igen i en annan ThreadPool tråd. I det här fallet bör händelsehanteraren vara reentrant.
Note
Händelsehanteringsmetoden kan köras på en tråd samtidigt som en annan tråd anropar Stop metoden eller anger Enabled egenskapen till false. Detta kan leda till Elapsed att händelsen utlöses efter att timern har stoppats. Exempelkoden för Stop metoden visar ett sätt att undvika det här konkurrenstillståndet.
Även om SynchronizingObject inte nullElapsed kan händelser inträffa efter Dispose att metoden eller Stop har anropats eller efter Enabled att egenskapen har angetts till false, eftersom signalen för att höja Elapsed händelsen alltid står i kö för körning på en trådpooltråd. Ett sätt att lösa det här konkurrenstillståndet är att ange en flagga som talar om för Elapsed händelsehanteraren att händelsen ska ignorera efterföljande händelser.
Om du använder System.Timers.Timer klassen med ett användargränssnittselement, till exempel ett formulär eller en kontroll, utan att placera timern på användargränssnittselementet, tilldelar du formuläret eller kontrollen som innehåller Timer egenskapen SynchronizingObject så att händelsen konverteras till användargränssnittstråden.
En lista över standardegenskapsvärden för en instans av Timerfinns i Timer konstruktorn.
Tip
.NET innehåller fyra klasser med namnet Timer, som var och en erbjuder olika funktioner:
- System.Timers.Timer (det här avsnittet): utlöser en händelse med jämna mellanrum. Klassen är avsedd att användas som en serverbaserad komponent eller tjänstkomponent i en flertrådad miljö. det har inget användargränssnitt och visas inte vid körning.
- System.Threading.Timer: kör en enda återanropsmetod i en trådpoolstråd med jämna mellanrum. Motringningsmetoden definieras när timern instansieras och inte kan ändras. Precis som klassen är den System.Timers.Timer här klassen avsedd att användas som en serverbaserad komponent eller tjänstkomponent i en miljö med flera gränssnitt. Den har inget användargränssnitt och är inte synlig vid körning.
- System.Windows.Forms.Timer: en Windows Forms-komponent som utlöser en händelse med jämna mellanrum. Komponenten har inget användargränssnitt och är utformad för användning i en entrådad miljö.
- System.Web.UI.Timer (endast .NET Framework): en ASP.NET komponent som utför asynkrona eller synkrona sidinlägg med jämna mellanrum.
Konstruktorer
| Name | Description |
|---|---|
| Timer() |
Initierar en ny instans av Timer klassen och anger alla egenskaper till deras initiala värden. |
| Timer(Double) |
Initierar en ny instans av Timer klassen och anger Interval egenskapen till det angivna antalet millisekunder. |
| Timer(TimeSpan) |
Initierar en ny instans av Timer klassen och anger Interval egenskapen till den angivna perioden. |
Egenskaper
| Name | Description |
|---|---|
| AutoReset |
Hämtar eller anger ett booleskt värde som anger om Timer händelsen endast ska höjas Elapsed en gång ( |
| CanRaiseEvents |
Hämtar ett värde som anger om komponenten kan generera en händelse. (Ärvd från Component) |
| Container |
Hämtar som IContainer innehåller Component. (Ärvd från Component) |
| DesignMode |
Hämtar ett värde som anger om det Component för närvarande är i designläge. (Ärvd från Component) |
| Enabled |
Hämtar eller anger ett värde som anger om Timer händelsen ska höjas Elapsed . |
| Events |
Hämtar listan över händelsehanterare som är kopplade till den här Component. (Ärvd från Component) |
| Interval |
Hämtar eller anger intervallet, uttryckt i millisekunder, där händelsen ska höjas Elapsed . |
| Site |
Hämtar eller anger den plats som binder Timer till containern i designläge. |
| SynchronizingObject |
Hämtar eller anger det objekt som används för att konvertera händelsehanteraranrop som utfärdas när ett intervall har förflutit. |
Metoder
| Name | Description |
|---|---|
| BeginInit() |
Påbörjar körningsinitiering av en Timer som används i ett formulär eller av en annan komponent. |
| Close() |
Släpper de resurser som används av Timer. |
| CreateObjRef(Type) |
Skapar ett objekt som innehåller all relevant information som krävs för att generera en proxy som används för att kommunicera med ett fjärrobjekt. (Ärvd från MarshalByRefObject) |
| Dispose() |
Släpper alla resurser som används av Component. (Ärvd från Component) |
| Dispose(Boolean) |
Släpper alla resurser som används av den aktuella Timer. |
| EndInit() |
Avslutar körningsinitiering av en Timer som används i ett formulär eller av en annan komponent. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetLifetimeService() |
Föråldrad.
Hämtar det aktuella livslängdstjänstobjektet som styr livslängdsprincipen för den här instansen. (Ärvd från MarshalByRefObject) |
| GetService(Type) |
Returnerar ett objekt som representerar en tjänst som tillhandahålls av Component eller av dess Container. (Ärvd från Component) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| InitializeLifetimeService() |
Föråldrad.
Hämtar ett tjänstobjekt för livslängd för att styra livslängdsprincipen för den här instansen. (Ärvd från MarshalByRefObject) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| MemberwiseClone(Boolean) |
Skapar en ytlig kopia av det aktuella MarshalByRefObject objektet. (Ärvd från MarshalByRefObject) |
| Start() |
Börjar höja Elapsed händelsen genom att ange Enabled till |
| Stop() |
Slutar höja Elapsed händelsen genom att ange Enabled till |
| ToString() |
Returnerar ett String som innehåller namnet på Component, om det finns. Den här metoden bör inte åsidosättas. (Ärvd från Component) |
Händelser
| Name | Description |
|---|---|
| Disposed |
Inträffar när komponenten tas bort av ett anrop till Dispose() metoden. (Ärvd från Component) |
| Elapsed |
Inträffar när intervallet förflutit. |
Gäller för
Trådsäkerhet
Alla offentliga static medlemmar av den här typen är trådsäkra. Vilka som helst instansmedlemmar garanteras inte att vara trådsäkra.