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, 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 metodu CheckStatus , jejíž podpis je stejný jako TimerCallback delegát. Argument stateCheckStatus metody je AutoResetEvent objekt, který se používá k synchronizaci vlákna aplikace a podproces fondu vláken, který spouští delegáta zpětného volání. Třída StatusChecker také obsahuje dvě proměnné stavu:

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

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

Vlákno aplikace vytvoří časovač, který čeká jednu sekundu a pak spustí metodu zpětného CheckStatus volání každých 250 milisekund. Vlákno aplikace pak blokuje, dokud AutoResetEvent není objekt signalizovat. Když metoda zpětného CheckStatus volání spustí maxCount časy, volá metodu AutoResetEvent.Set pro nastavení stavu 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. Znovu blokuje, dokud AutoResetEvent není objekt signalizovat. Když k tomu dojde, časovač je zničen voláním své 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í delegáta TimerCallback určete metodu, kterou chcete Timer spustit. Podpis delegáta TimerCallback je:

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

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

Tip

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

  • System.Timers.Timer, která aktivuje událost a v pravidelných intervalech spouští kód v jedné nebo více jímkách událostí. 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, která v pravidelných intervalech provádí 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á k 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 komponentu, která aktivuje událost a v pravidelných intervalech spustí kód v jedné nebo více jímkách událostí. Komponenta nemá žádné uživatelské rozhraní a je určena pro použití v jednovláknovém prostředí; spustí se ve vlákně uživatelského rozhraní.
  • System.Web.UI.Timer (pouze rozhraní .NET Framework), ASP.NET komponenta, která provádí asynchronní nebo synchronní zpětné odeslání 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 zadat dobu čekání před prvním spuštěním metody (due time) a 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 doba kratší než rozlišení systémových hodin, TimerCallback delegát se spustí v intervalech definovaných rozlišením systémových hodin, což je ve Windows 7 a Windows 8 systémech přibližně 15 milisekund. Pomocí metody můžete změnit dobu splnění a období nebo časovač Change zakázat.

Poznámka

Pokud používáte Timer, musí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í, nezabrání jeho shromáždění.

Poznámka

Systémové hodiny, které se používají, jsou stejné hodiny jako GetTickCount, které nejsou ovlivněny změnami timeBeginPeriod a timeEndPeriod.

Pokud časovač již není potřeba, použijte metodu Dispose k uvolnění prostředků držených časovačem. Všimněte si, že zpětná volání mohou nastat 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 zadat, protože je volána ve ThreadPool vláknech. Zpětné volání může být spuštěno současně na dvou vláknech fondu vláken, pokud je interval časovače kratší, než je doba potřebná k provedení 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ý a jednoduchý časovač, který používá metody zpětného volání a je obsluhován vlákny fondu vláken. Nedoporučuje se používat s model Windows Forms, protože jeho zpětná volání nedochází ve vlákně uživatelského rozhraní. System.Windows.Forms.Timerje 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 nabízí další funkce.

Konstruktory

Timer(TimerCallback)

Inicializuje novou instanci Timer třídy s nekonečnou tečkou a nekonečnou dobou splnění, pomocí nově vytvořeného Timer objektu jako objektu stavu.

Timer(TimerCallback, Object, Int32, Int32)

Inicializuje novou instanci Timer třídy pomocí 32bitového celého čísla se signedýmm pro určení časového intervalu.

Timer(TimerCallback, Object, Int64, Int64)

Inicializuje novou instanci třídy pomocí 64bitových Timer celých čísel se signedýmmchmům pro 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 třídy pomocí 32bitových Timer 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č je v určitém okamžiku v budoucnu zaregistrován ke zaškrtnutí a ještě nebyl zrušen.

Metody

Change(Int32, Int32)

Změní čas spuštění a interval mezi voláními metody časovače 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 voláními metody pro časovač pomocí 64bitových celých čísel se znaménkem k měření časových intervalů.

Change(TimeSpan, TimeSpan)

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

Change(UInt32, UInt32)

Změní čas spuštění a interval mezi voláními 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 sloužící 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 signalizuje, když časovač byl odstraněn.

DisposeAsync()

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

Equals(Object)

Určí, zda se zadaný objekt rovná 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ředtím, než je uvolněna uvolňováním paměti.

GetHashCode()

Slouží jako výchozí hashovací funkce.

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

Načte aktuální životnost objektu služby, který řídí zásady životnosti pro tuto instanci.

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

Type Získá z aktuální instance.

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

Získá životnost objektu služby, 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)
ToString()

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

(Zděděno od Object)

Metody rozšíření

ConfigureAwait(IAsyncDisposable, Boolean)

Konfiguruje, jak se provádí funkce awaits u úloh vrácených z asynchronního jednorázového režimu.

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é