Timer Třída

Definice

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

public ref class Timer sealed : IDisposable
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, 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
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 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. Argumentem metody je objekt, který se používá k synchronizaci vlákna aplikace a vlákna fondu vláken, které state CheckStatus spouští AutoResetEvent delegáta zpětného volání. Třída StatusChecker obsahuje také 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 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 volání CheckStatus každých 250 milisekund. Vlákno aplikace pak blokuje, dokud AutoResetEvent není objekt signalizován. Když metoda zpětného volání provede časy, volá metodu , která nastaví CheckStatus maxCount stav objektu na AutoResetEvent.Set AutoResetEvent signalizován. Když k tomu dojde poprvé, vlákno aplikace zavolá metodu , takže metoda zpětného volání Change(Int32, Int32) se teď provede každou polovinu sekundy. Znovu se zablokuje, dokud AutoResetEvent nebude objekt signalizován. Když k tomu dojde, časovač se zničí voláním své metody a Dispose 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 Timer chcete spustit. 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 zkonstruování časovače a nelze jej změnit. Metoda se nespouštěl ve vlákně, které časovač vytvořilo. provádí ve ThreadPool vlákně dodaném systémem.

Tip

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

  • System.Timers.Timer, která spustí událost a spustí kód v jednom nebo více jímcích událostí v pravidelných intervalech. Třída je určená pro použití jako součást serveru nebo komponenty služby ve vícevláknových prostředích. 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 je tato třída určená pro použití jako součást služby nebo serveru ve vícevláknových prostředích; nemá žádné uživatelské rozhraní a není viditelná System.Timers.Timer za běhu.
  • System.Windows.Forms.Timer– Windows Forms, která vyžádá událost a spustí kód v jedné nebo více jímcích událostí v pravidelných intervalech. Komponenta nemá žádné uživatelské rozhraní a je určená k použití v prostředí s jedním vláknem. Spustí se ve vlákně uživatelského rozhraní.
  • System.Web.UI.Timer(.NET Framework pouze ), ASP.NET, která provádí asynchronní nebo synchronní postbacky webové stránky v pravidelných intervalech.
  • System.Windows.Threading.DispatcherTimer– časovač integrovaný do Dispatcher fronty. 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 čekání před prvním provedením metody (čas splatnosti) 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 menší než rozlišení systémových hodin, delegát se spustí v intervalech definovaných rozlišením systémových hodin, což je přibližně 15 milisekund v systémech Windows 7 a TimerCallback Windows 8. Čas a období splatnosti můžete změnit nebo můžete časovač zakázat pomocí Change metody .

Poznámka

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

Pokud už časovač nepotřebujete, pomocí metody můžete volná Dispose prostředky, které časovač uchová. Všimněte si, že zpětná volání mohou nastat po zavolána přetížení metody, protože časovač za fronty zpětná volání pro provádění Dispose() vlákna fondu vláken. Přetížení metody můžete použít k čekání na dokončení všech Dispose(WaitHandle) zpětných volání.

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

Poznámka

System.Threading.Timer je jednoduchý odlehčený časovač, který používá metody zpětného volání a je obsluhon vlákny fondu vláken. Nedoporučuje se používat s 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 Windows Forms. U funkcí časovače založeného na serveru můžete zvážit použití funkce , která vyvolává System.Timers.Timer události a má další funkce.

Konstruktory

Timer(TimerCallback)

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

Timer(TimerCallback, Object, Int32, Int32)

Inicializuje novou instanci třídy pomocí 32bitového celého čísla se znaménkem k Timer určení časového intervalu.

Timer(TimerCallback, Object, Int64, Int64)

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

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

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

Timer(TimerCallback, Object, UInt32, UInt32)

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

Vlastnosti

ActiveCount

Získá počet časovačů, které jsou aktuálně aktivní. Aktivní časovač je zaregistrován tak, aby byl v budoucnu v budoucnosti a ještě nebyl zrušen.

Metody

Change(Int32, Int32)

Změní čas spuštění a interval mezi voláními metod pro časovač, pomocí 32 celých čísel se znaménkem pro měření časových intervalů.

Change(Int64, Int64)

Změní čas spuštění a interval mezi voláními metod pro časovač, pomocí 64 celých čísel se znaménkem pro měření časových intervalů.

Change(TimeSpan, TimeSpan)

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

Change(UInt32, UInt32)

Změní čas spuštění a interval mezi voláními metod pro časovač, pomocí 32 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 používané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í a Timer signálů, pokud byl časovač 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, aby se pokusil o uvolnění prostředků a provedení dalších operací čištění před jeho uvolněním uvolňováním paměti.

GetHashCode()

Slouží jako výchozí funkce hash.

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

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

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

Získá Type aktuální instanci.

(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 souboru .

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

Vytvoří kopii aktuálního objektu bez MarshalByRefObject podmět.

(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 await u úloh vrácených z asynchronní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é