Timer Třída

Definice

Poskytuje mechanismus pro spuštění metody ve vlákně fondu vláken v zadaných intervalech. Tato třída se nemůže dědit.

public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, System::Threading::ITimer
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, System.Threading.ITimer
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
    interface ITimer
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements ITimer
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Dědičnost
Timer
Dědičnost
Atributy
Implementuje

Příklady

Následující příklad definuje StatusChecker třídu, která obsahuje metodu CheckStatus , jejíž podpis je stejný jako TimerCallback delegát. Argumentem stateCheckStatus metody je AutoResetEvent objekt, který se používá k synchronizaci vlákna aplikace a vlákna fondu vláken, která spouští delegát zpětného volání. Třída StatusChecker obsahuje také dvě stavové proměnné:

invokeCount
Označuje, kolikrát byla vyvolána metoda zpětného volání.

maxCount
Určuje maximální počet vyvolání metody zpětného volání.

Vlákno aplikace vytvoří časovač, který počká jednu sekundu a pak spustí metodu zpětného CheckStatus volání každých 250 milisekund. Vlákno aplikace pak blokuje, dokud AutoResetEvent objekt nebude signalován. Když metoda zpětného CheckStatus volání spustí časy maxCount , volá metodu AutoResetEvent.Set , která nastaví stav objektu AutoResetEvent signalizovat. Když k tomu dojde poprvé, vlákno aplikace volá metodu Change(Int32, Int32) tak, aby metoda zpětného volání nyní spustila každou půl sekundu. Opět se zablokuje, dokud AutoResetEvent objekt nebude signalován. Když k tomu dojde, časovač je zničen voláním jeho Dispose metody a aplikace se ukončí.

using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        var autoEvent = new AutoResetEvent(false);
        
        var statusChecker = new StatusChecker(10);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", 
                          DateTime.Now);
        var stateTimer = new Timer(statusChecker.CheckStatus, 
                                   autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne();
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne();
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    private int invokeCount;
    private int  maxCount;

    public StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.", 
            DateTime.Now.ToString("h:mm:ss.fff"), 
            (++invokeCount).ToString());

        if(invokeCount == maxCount)
        {
            // Reset the counter and signal the waiting thread.
            invokeCount = 0;
            autoEvent.Set();
        }
    }
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Use an AutoResetEvent to signal the timeout threshold in the
        ' timer callback has been reached.
        Dim autoEvent As New AutoResetEvent(False)

        Dim statusChecker As New StatusChecker(10)

        ' Create a timer that invokes CheckStatus after one second, 
        ' and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer." & vbCrLf, 
                          DateTime.Now)
        Dim stateTimer As New Timer(AddressOf statusChecker.CheckStatus, 
                                    autoEvent, 1000, 250)

        ' When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne()
        stateTimer.Change(0, 500)
        Console.WriteLine(vbCrLf & "Changing period to .5 seconds." & vbCrLf)

        ' When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne()
        stateTimer.Dispose()
        Console.WriteLine(vbCrLf & "Destroying timer.")
    End Sub
End Module

Public Class StatusChecker
    Dim invokeCount, maxCount As Integer 

    Sub New(count As Integer)
        invokeCount  = 0
        maxCount = count
    End Sub

    ' The timer callback method.
    Sub CheckStatus(stateInfo As Object)
        Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
        invokeCount += 1
        Console.WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.", 
                          DateTime.Now, invokeCount)
        If invokeCount = maxCount Then
            ' Reset the counter and signal the waiting thread.
            invokeCount = 0
            autoEvent.Set()
        End If
    End Sub
End Class
' The example displays output like the following:
'       11:59:54.202 Creating timer.
'       
'       11:59:55.217 Checking status  1.
'       11:59:55.466 Checking status  2.
'       11:59:55.716 Checking status  3.
'       11:59:55.968 Checking status  4.
'       11:59:56.218 Checking status  5.
'       11:59:56.470 Checking status  6.
'       11:59:56.722 Checking status  7.
'       11:59:56.972 Checking status  8.
'       11:59:57.223 Checking status  9.
'       11:59:57.473 Checking status 10.
'       
'       Changing period to .5 seconds.
'       
'       11:59:57.474 Checking status  1.
'       11:59:57.976 Checking status  2.
'       11:59:58.476 Checking status  3.
'       11:59:58.977 Checking status  4.
'       11:59:59.477 Checking status  5.
'       11:59:59.977 Checking status  6.
'       12:00:00.478 Checking status  7.
'       12:00:00.980 Checking status  8.
'       12:00:01.481 Checking status  9.
'       12:00:01.981 Checking status 10.
'       
'       Destroying timer.

Poznámky

Pomocí delegáta TimerCallback určete metodu Timer , kterou chcete spustit. Podpis delegáta TimerCallback je:

void TimerCallback(Object state)
Sub TimerCallback(state As Object)

Delegát časovače je určen při vytváření časovače a nelze ho změnit. Metoda se nespustí ve vlákně, které vytvořil časovač; spustí se na vlákně ThreadPool dodaném systémem.

Tip

.NET zahrnuje několik tříd časovače, z nichž každá nabízí různé funkce:

  • System.Timers.Timer, který aktivuje událost a spustí kód v jednom nebo více jímkách 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, který spouští jednu metodu zpětného volání ve vlákně fondu vláken v pravidelných intervalech. 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 model Windows Forms, která aktivuje událost a spustí kód v jednom nebo více jímkách událostí v pravidelných intervalech. Komponenta nemá žádné uživatelské rozhraní a je navržena pro použití v prostředí s jedním vláknem; spustí se ve vlákně uživatelského rozhraní.
  • System.Web.UI.Timer (pouze .NET Framework), komponenta ASP.NET, která provádí asynchronní nebo synchronní postbacky webových stránek v pravidelných intervalech.
  • System.Windows.Threading.DispatcherTimer, časovač integrovaný do fronty Dispatcher. Tento časovač se zpracovává se zadanou prioritou v zadaném časovém intervalu.

Při vytváření časovače můžete určit dobu, po kterou se má čekat před prvním spuštěním metody (termín splnění) a určitou dobu čekání mezi následnými spuštěními (období). Třída Timer má stejné rozlišení jako systémové hodiny. To znamená, že pokud je období menší než rozlišení systémových hodin, spustí se delegát TimerCallback v intervalech definovaných rozlišením systémových hodin, což je přibližně 15 milisekund na Windows 7 a Windows 8 systémech. Pomocí metody můžete změnit čas splnění a období nebo zakázat časovač Change .

Note

Pokud používáte , Timermusíte na něj zachovat odkaz. Stejně jako u jakéhokoli spravovaného objektu Timer podléhá uvolňování paměti, pokud na něj nejsou žádné odkazy. Skutečnost, že Timer je stále aktivní, nebrání jeho shromažďování.

Note

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.

Pokud časovač už není potřeba, použijte metodu Dispose k uvolnění prostředků uložených časovačem. Všimněte si, že zpětné volání může dojít po Dispose() volání přetížení metody, protože časovač zařadí zpětná volání ke spuštění vlákny fondu vláken. Přetížení metody můžete použít Dispose(WaitHandle) k čekání na dokončení všech zpětných volání.

Metoda zpětného volání spuštěná časovačem by měla být znovu vyvolána, protože je volána ve ThreadPool vláknech. Zpětné volání lze provést současně na dvou vláknech fondu vláken, pokud je interval časovače kratší než doba potřebná ke spuštění zpětného volání, nebo pokud jsou všechna vlákna fondu vláken používána a zpětné volání je zařazeno do fronty vícekrát.

Note

System.Threading.Timer je jednoduchý jednoduchý časovač, který používá metody zpětného volání a obsluhuje je vlákny fondu vláken. Nedoporučuje se používat s model Windows Forms, protože jeho zpětná volání se nenachází ve vlákně uživatelského rozhraní. System.Windows.Forms.Timer je lepší volbou pro použití s model Windows Forms. U serverových funkcí časovače můžete zvážit použití System.Timers.Timer, které vyvolává události a má další funkce.

Konstruktory

Name Description
Timer(TimerCallback, Object, Int32, Int32)

Inicializuje novou instanci Timer třídy pomocí 32bitového signed integer k určení časového intervalu.

Timer(TimerCallback, Object, Int64, Int64)

Inicializuje novou instanci Timer třídy pomocí 64bitových signed integers k měření časových intervalů.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Inicializuje novou instanci Timer třídy pomocí TimeSpan hodnot k měření časových intervalů.

Timer(TimerCallback, Object, UInt32, UInt32)

Inicializuje novou instanci Timer třídy pomocí 32bitové celé číslo bez znaménka k měření časových intervalů.

Timer(TimerCallback)

Inicializuje novou instanci Timer třídy s nekonečným obdobím a nekonečným časem splnění pomocí nově vytvořeného Timer objektu jako stav objektu.

Vlastnosti

Name Description
ActiveCount

Získá počet časovačů, které jsou aktuálně aktivní. Aktivní časovač se v určitém okamžiku v budoucnu zaregistruje a ještě ho nezrušil.

Metody

Name Description
Change(Int32, Int32)

Změní čas spuštění a interval mezi vyvoláním metody pro časovač pomocí 32bitových celých čísel se znaménkem k měření časových intervalů.

Change(Int64, Int64)

Změní čas spuštění a interval mezi vyvoláním metody pro časovač pomocí 64bitových znaménka k měření časových intervalů.

Change(TimeSpan, TimeSpan)

Změní čas spuštění a interval mezi vyvoláním metody pro časovač pomocí TimeSpan hodnot k měření časových intervalů.

Change(UInt32, UInt32)

Změní čas spuštění a interval mezi vyvoláním metody pro časovač pomocí 32bitových celých čísel bez znaménka k měření časových intervalů.

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é aktuální instancí Timer.

Dispose(WaitHandle)

Uvolní všechny prostředky používané aktuální instancí Timer a signály, když časovač byl uvolněn.

DisposeAsync()

Uvolní všechny prostředky používané aktuální instancí Timer.

Equals(Object)

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

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

Umožňuje objektu pokusit se uvolnit prostředky a provést další operace čištění před uvolněním paměti.

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)
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)
ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Metody rozšíření

Name Description
ConfigureAwait(IAsyncDisposable, Boolean)

Konfiguruje, jak čekají na úlohy vrácené z asynchronního jednorázového použití.

Platí pro

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

Tento typ je bezpečný pro přístup z více vláken.

Viz také