Timer Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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(TimerCallback, Object, Int64, Int64) |
Inicializuje novou instanci třídy |
Timer(TimerCallback, Object, TimeSpan, TimeSpan) |
Inicializuje novou instanci třídy |
Timer(TimerCallback, Object, UInt32, UInt32) |
Inicializuje novou instanci třídy |
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.