Sdílet prostřednictvím


Timer Třída

Definice

Vygeneruje událost po nastaveném intervalu s možností generovat opakované události.

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 událost Timer.Elapsed každých 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 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 v aplikaci po uplynutí počtu milisekund ve Interval vlastnosti. Objekt můžete nakonfigurovat Timer tak, aby vyvolal událost jen jednou nebo opakovaně pomocí AutoReset vlastnosti. Objekt je obvykle Timer deklarován na úrovni třídy tak, aby zůstal v oboru, pokud je potřeba. Pak můžete zpracovat její Elapsed událost a zajistit tak pravidelné zpracování. Předpokládejme například, že máte kritický server, který musí běžet 24 hodin denně, 7 dní v týdnu. Můžete vytvořit službu, která používá Timer objekt k pravidelné kontrole serveru a zajištění, že je systém spuštěný a spuštěný. Pokud systém nereaguje, může se služba pokusit server restartovat 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 rozhraní IDisposable. Jakmile skončíte s používáním typu, měli byste ho odstranit buď přímo, nebo nepřímo. Chcete-li typ odstranit přímo, zavolejte jeho Dispose metodu v bloku try/catch. Pokud ho chcete zlikvidovat nepřímo, použijte konstruktor jazyka, jako je using (v jazyce C#) nebo Using (v jazyce Visual Basic). Další informace naleznete 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 a zpracovávat vyvolanou Elapsed událost, což vede k vyšší přesnosti než časovače Systému Windows při vyvolání události včas.

Komponenta System.Timers.TimerElapsed vyvolá událost na základě hodnoty (v milisekundách) Interval vlastnosti. Tuto událost můžete zpracovat, abyste provedli potřebné zpracování. Předpokládejme například, že máte online prodejní aplikaci, která nepřetržitě publikuje prodejní objednávky do databáze. Služba, která kompiluje pokyny pro expedici, funguje v dávce objednávek, nikoli jednotlivě zpracovávat každou objednávku. K zahájení dávkového zpracování můžete použít Timer každých 30 minut.

Důležité

Třída System.Timers.Timer má stejné rozlišení jako systémové hodiny. To znamená, že Elapsed událost 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 vlastnosti Interval.

Poznámka:

Systémové hodiny, které se používají, jsou stejné hodiny, které používá GetTickCount, což nejsou ovlivněny změnami provedenými v timeBeginPeriod a timeEndPeriod.

Je-li AutoReset nastavena na false, System.Timers.Timer objekt vyvolá Elapsed událost pouze jednou, jakmile Interval první uplynul. Pokud chcete událost pravidelně zvyšovat Elapsed v intervalu definovaném parametrem Interval, nastaveno 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 je znázorněno v následujícím příkladu. Další informace o výjimkách vyvolaných asynchronními metodami naleznete 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, Intervalmůže být událost znovu vyvolána v jiném ThreadPool vlákně. V této situaci by obslužná rutina události měla být znovu zadána.

Poznámka:

Metoda zpracování událostí může běžet na jednom vlákně současně, ž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. Příklad kódu pro metodu Stop ukazuje jeden způsob, jak se vyhnout této časování podmínky.

I když SynchronizingObject není null, Elapsed události mohou nastat po Dispose volání nebo metodě nebo Stop po Enabled nastavení falsevlastnosti , 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 tento stav časování vyřešit, je nastavit příznak, který obslužné rutině Elapsed události říká, aby událost ignorovala následné události.

Pokud používáte System.Timers.Timer třídu s prvkem 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řazena do vlákna uživatelského rozhraní.

Seznam výchozích hodnot vlastností pro instanci Timernaleznete v konstruktoru Timer .

Návod

.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 k použití jako serverová součást 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 spustí 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 Podobně jako třída je tato třída určená k použití jako serverová součást 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: 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 (Pouze rozhraní .NET Framework): komponenta ASP.NET, která provádí asynchronní nebo synchronní postbacky webových stránek v pravidelných intervalech.

Konstruktory

Name Description
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

Name Description
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 určující, zda komponenta může vyvolat událost.

(Zděděno od Component)
Container

Získá ten IContainer , který obsahuje Component.

(Zděděno od Component)
DesignMode

Získá hodnotu, která označuje, zda Component je aktuálně v režimu návrhu.

(Zděděno od Component)
Enabled

Získá nebo nastaví hodnotu určující, zda TimerElapsed vyvolat 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, při kterém má Elapsed vyvolat událost.

Site

Získá nebo nastaví web, který vytvoří vazbu k jeho kontejneru Timer v režimu návrhu.

SynchronizingObject

Získá nebo nastaví objekt použitý k zařazování volání obslužné rutiny události, které jsou vydány při uplynutí intervalu.

Metody

Name Description
BeginInit()

Zahájí inicializaci za běhu používaného Timer ve formuláři nebo jinou komponentou.

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 serveru sloužící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 Timer.

EndInit()

Ukončí inicializaci za běhu používaného Timer ve formuláři nebo jiné součásti.

Equals(Object)

Určuje, zda je zadaný objekt roven aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí funkce hash.

(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 jeho Container.

(Zděděno od Component)
GetType()

Získá Type aktuální instance.

(Zděděno od Object)
InitializeLifetimeService()
Zastaralé.

Získá objekt služby životnosti pro řízení zásad životnosti pro tuto instanci.

(Zděděno od MarshalByRefObject)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Object.

(Zděděno od Object)
MemberwiseClone(Boolean)

Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu.

(Zděděno od MarshalByRefObject)
Start()

Začne zvyšovat Elapsed událost nastavením Enabled na true.

Stop()

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

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

Name Description
Disposed

Nastane, když komponenta je uvolněna voláním Dispose() metody.

(Zděděno od Component)
Elapsed

Nastane, když interval uplynou.

Platí pro

Bezpečný přístup z více vláken

Všechny veřejné static členy tohoto typu jsou bezpečné pro přístup z více vláken. U žádného člena instance není zaručena bezpečnost pro přístup z více vláken.

Viz také