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. 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 state
CheckStatus
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(TimerCallback, Object, Int64, Int64) |
Inicializuje novou instanci třídy pomocí 64bitových |
Timer(TimerCallback, Object, TimeSpan, TimeSpan) |
Inicializuje novou instanci |
Timer(TimerCallback, Object, UInt32, UInt32) |
Inicializuje novou instanci třídy pomocí 32bitových |
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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro