Sdílet prostřednictvím


Timer Třída

Definice

Poskytuje mechanismus pro spuštění metody ve vlákně fondu vláken v zadaných intervalech. Tuto třídu nelze zdědit.

public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Timer sealed : MarshalByRefObject, System::Threading::ITimer
public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
public sealed class Timer : MarshalByRefObject, System.Threading.ITimer
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
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
    interface ITimer
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 IAsyncDisposable, IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements ITimer
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 CheckStatus metodu, jejíž podpis je stejný jako TimerCallback delegát. state argument metody CheckStatus je AutoResetEvent objekt, který slouží 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 volání metodu zpětného volání.

Vlákno aplikace vytvoří časovač, který počká jednu sekundu a pak spustí metodu zpětného volání CheckStatus každých 250 milisekund. Vlákno aplikace pak blokuje, dokud nebude objekt AutoResetEvent signalován. Když CheckStatus metoda zpětného volání spustí maxCount časy, zavolá AutoResetEvent.Set metodu, 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 blokuje, dokud AutoResetEvent objekt není signalován. Když k tomu dojde, časovač je zničen voláním jeho Dispose metody a aplikace se ukončí.

using namespace System;
using namespace System::Threading;

ref class StatusChecker
{
private:
    int invokeCount, maxCount;

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

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

        if (invokeCount == maxCount) {
            // Reset the counter and signal the waiting thread.
            invokeCount  = 0;
            autoEvent->Set();
        }
    }
};

ref class TimerExample
{
public:
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        AutoResetEvent^ autoEvent = gcnew AutoResetEvent(false);

        StatusChecker^ statusChecker = gcnew StatusChecker(10);

        // Create a delegate that invokes methods for the timer.
        TimerCallback^ tcb =
           gcnew TimerCallback(statusChecker, &StatusChecker::CheckStatus);

        // 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);
        Timer^ stateTimer = gcnew Timer(tcb, autoEvent, 1000, 250);

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

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent->WaitOne(5000, false);
        stateTimer->~Timer();
        Console::WriteLine("\nDestroying timer.");
    }
};

int main()
{
    TimerExample::Main();
}
// 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.
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í TimerCallback delegáta určete metodu, kterou má Timer provést. Podpis delegáta TimerCallback je:

void TimerCallback(Object state)
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 ThreadPool vlákně dodaném systémem.

Spropitné

.NET obsahuje 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. Podobně jako třída System.Timers.Timer je tato třída 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.Windows.Forms.Timer, komponenta 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 rozhraní .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č, který je 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, bude delegát TimerCallback provádět v intervalech definovaných rozlišení systémových hodin, což je přibližně 15 milisekund v systémech Windows 7 a Windows 8. Pomocí metody Change můžete změnit čas splnění a období nebo časovač zakázat.

Poznámka

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

Poznámka

Systémové hodiny používané GetTickCount, které nejsou ovlivněny změnami provedenými timeBeginPeriod a timeEndPeriod.

Pokud už časovač nepotřebujete, použijte metodu Dispose k uvolnění prostředků uložených časovačem. Všimněte si, že zpětná volání mohou nastat po volání přetížení metody Dispose(), protože časovač zařadí zpětná volání pro spuštění vlákny fondu vláken. Přetížení metody Dispose(WaitHandle) můžete použít 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 reentrant, protože je volána na ThreadPool vlákna. 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.

Poznámka

System.Threading.Timer je jednoduchý, jednoduchý časovač, který používá metody zpětného volání a obsluhuje vlákna fondu vláken. Nedoporučuje se používat s 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 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

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 objektu Timer jako stav objektu.

Timer(TimerCallback, Object, Int32, Int32)

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

Timer(TimerCallback, Object, Int64, Int64)

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

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

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

Timer(TimerCallback, Object, UInt32, UInt32)

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

Vlastnosti

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

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í hodnot TimeSpan 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 objektu MarshalByRefObject.

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

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

(Zděděno od Object)

Metody rozšíření

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é