Sdílet prostřednictvím


Timer Třída

Definice

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 truehodnotu , 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 nullvlastnost , 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 (false) nebo opakovaně (true).

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 true.

Stop()

Zastaví vyvolání Elapsed události nastavením Enabled na falsehodnotu .

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.

Viz také