Timer Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Udostępnia mechanizm wykonywania metody w wątku puli wątków w określonych odstępach czasu. Klasa ta nie może być dziedziczona.
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
- Dziedziczenie
-
Timer
- Dziedziczenie
- Atrybuty
- Implementuje
Przykłady
W poniższym przykładzie zdefiniowano klasę zawierającą metodę StatusChecker
CheckStatus
, której podpis jest taki sam jak TimerCallback delegat. Argument state
CheckStatus
metody to AutoResetEvent obiekt używany do synchronizowania wątku aplikacji i wątku puli wątków, który wykonuje delegata wywołania zwrotnego. Klasa StatusChecker
zawiera również dwie zmienne stanu:
invokeCount
Wskazuje liczbę wywołań zwrotnych metody wywołania zwrotnego.
maxCount
Określa maksymalną liczbę wywołań zwrotnych, które należy wywołać.
Wątek aplikacji tworzy czasomierz, który czeka jedną sekundę, a następnie wykonuje metodę CheckStatus
wywołania zwrotnego co 250 milisekund. Następnie wątek aplikacji blokuje się do AutoResetEvent momentu zasygnalizowanego obiektu. CheckStatus
Gdy metoda wywołania zwrotnego wykonuje maxCount
czasy, wywołuje AutoResetEvent.Set
metodę , aby ustawić stan AutoResetEvent obiektu na sygnał. Po raz pierwszy w ten sposób wątek aplikacji wywołuje metodę Change(Int32, Int32) , aby metoda wywołania zwrotnego jest wykonywana co pół sekundy. Po raz kolejny blokuje, dopóki AutoResetEvent obiekt nie zostanie zasygnalizowany. W takim przypadku czasomierz jest niszczony przez wywołanie metody Dispose , a aplikacja kończy działanie.
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.
Uwagi
Użyj delegata, aby określić metodę TimerCallback , którą chcesz Timer wykonać. Podpis delegata TimerCallback to:
void TimerCallback(Object state)
void TimerCallback(Object state)
Sub TimerCallback(state As Object)
Delegat czasomierza jest określony podczas konstruowania czasomierza i nie można go zmienić. Metoda nie jest wykonywana w wątku, który utworzył czasomierz; wykonuje w wątku dostarczonym ThreadPool przez system.
Porada
Platforma .NET zawiera kilka klas czasomierza, z których każda oferuje różne funkcje:
- System.Timers.Timer, który uruchamia zdarzenie i wykonuje kod w co najmniej jednym ujściu zdarzeń w regularnych odstępach czasu. Klasa jest przeznaczona do użycia jako składnik usługi lub oparty na serwerze w środowisku wielowątkowym; nie ma interfejsu użytkownika i nie jest widoczny w czasie wykonywania.
- System.Threading.Timer, który wykonuje pojedynczą metodę wywołania zwrotnego w wątku puli wątków w regularnych odstępach czasu. Metoda wywołania zwrotnego jest definiowana po utworzeniu wystąpienia czasomierza i nie można jej zmienić. System.Timers.Timer Podobnie jak klasa, ta klasa jest przeznaczona do użycia jako składnik usługi lub oparty na serwerze w środowisku wielowątkowym; nie ma interfejsu użytkownika i nie jest widoczna w czasie wykonywania.
- System.Windows.Forms.Timer, składnik Windows Forms, który uruchamia zdarzenie i wykonuje kod w co najmniej jednym ujściu zdarzeń w regularnych odstępach czasu. Składnik nie ma interfejsu użytkownika i jest przeznaczony do użytku w środowisku jednowątkowym; jest wykonywany w wątku interfejsu użytkownika.
- System.Web.UI.Timer(tylko .NET Framework), składnik ASP.NET, który wykonuje asynchroniczne lub synchroniczne postbacki stron internetowych w regularnych odstępach czasu.
- System.Windows.Threading.DispatcherTimer, czasomierz zintegrowany z kolejką
Dispatcher
. Ten czasomierz jest przetwarzany z określonym priorytetem w określonym przedziale czasu.
Podczas tworzenia czasomierza można określić czas oczekiwania przed pierwszym wykonaniem metody (czas ukończenia) oraz czas oczekiwania między kolejnymi wykonaniami (okresem). Klasa Timer ma taką samą rozdzielczość jak zegar systemowy. Oznacza to, że jeśli okres jest mniejszy niż rozdzielczość zegara systemowego, TimerCallback delegat będzie wykonywany w odstępach czasu zdefiniowanych przez rozdzielczość zegara systemowego, który wynosi około 15 milisekund w systemach Windows 7 i Windows 8. Możesz zmienić termin i okres lub wyłączyć czasomierz przy użyciu Change metody .
Uwaga
Tak długo, jak używasz elementu Timer, musisz zachować do niego odwołanie. Podobnie jak w przypadku każdego zarządzanego obiektu, obiekt podlega odśmieceniu pamięci, Timer gdy nie ma do niego odwołań. Fakt, że Timer element jest nadal aktywny, nie uniemożliwia jego zbierania.
Uwaga
Zegar systemowy, który jest używany, jest tym samym zegarem używanym przez getTickCount, który nie ma wpływu na zmiany wprowadzone z timeBeginPeriod i timeEndPeriod.
Gdy czasomierz nie jest już potrzebny, użyj Dispose metody , aby zwolnić zasoby przechowywane przez czasomierz. Należy pamiętać, że wywołania zwrotne mogą wystąpić po Dispose() wywołaniu przeciążenia metody, ponieważ kolejki czasomierza wywołania zwrotne do wykonania przez wątki puli wątków. Za pomocą Dispose(WaitHandle) przeciążenia metody można poczekać na zakończenie wszystkich wywołań zwrotnych.
Metoda wywołania zwrotnego wykonywana przez czasomierz powinna być ponownie uruchamiana, ponieważ jest wywoływana w ThreadPool wątkach. Wywołanie zwrotne można wykonać jednocześnie w dwóch wątkach puli wątków, jeśli interwał czasomierza jest krótszy niż czas wymagany do wykonania wywołania zwrotnego lub jeśli wszystkie wątki puli wątków są używane, a wywołanie zwrotne jest w kolejce wiele razy.
Uwaga
System.Threading.Timer jest prostym, lekkim czasomierzem, który używa metod wywołania zwrotnego i jest obsługiwany przez wątki puli wątków. Nie zaleca się używania z Windows Forms, ponieważ jego wywołania zwrotne nie występują w wątku interfejsu użytkownika. System.Windows.Forms.Timerjest lepszym wyborem do użycia z Windows Forms. W przypadku funkcji czasomierza opartej na serwerze warto rozważyć użycie metody System.Timers.Timer, która zgłasza zdarzenia i ma dodatkowe funkcje.
Konstruktory
Timer(TimerCallback) |
Inicjuje nowe wystąpienie Timer klasy z nieskończonym okresem i nieskończonym czasem ukończenia, używając nowo utworzonego Timer obiektu jako obiektu stanu. |
Timer(TimerCallback, Object, Int32, Int32) |
Inicjuje |
Timer(TimerCallback, Object, Int64, Int64) |
Inicjuje |
Timer(TimerCallback, Object, TimeSpan, TimeSpan) |
Inicjuje |
Timer(TimerCallback, Object, UInt32, UInt32) |
Inicjuje |
Właściwości
ActiveCount |
Pobiera liczbę czasomierzy, które są obecnie aktywne. Aktywny czasomierz jest zarejestrowany w celu zaznacznia w pewnym momencie w przyszłości i nie został jeszcze anulowany. |
Metody
Change(Int32, Int32) |
Zmienia czas rozpoczęcia i interwał między wywołaniami metody dla czasomierza, używając 32-bitowych liczb całkowitych ze znakiem w celu mierzenia interwałów czasu. |
Change(Int64, Int64) |
Zmienia czas rozpoczęcia i interwał między wywołaniami metod dla czasomierza, używając 64-bitowych liczb całkowitych ze znakiem w celu mierzenia interwałów czasu. |
Change(TimeSpan, TimeSpan) |
Zmienia czas rozpoczęcia i interwał między wywołaniami metody dla czasomierza, używając TimeSpan wartości do mierzenia interwałów czasu. |
Change(UInt32, UInt32) |
Zmienia czas rozpoczęcia i interwał między wywołaniami metod dla czasomierza, używając 32-bitowych liczb całkowitych bez znaku, aby mierzyć interwały czasu. |
CreateObjRef(Type) |
Tworzy obiekt zawierający wszystkie istotne informacje wymagane do wygenerowania serwera proxy używanego do komunikowania się z obiektem zdalnym. (Odziedziczone po MarshalByRefObject) |
Dispose() |
Zwalnia wszystkie zasoby używane przez bieżące wystąpienie programu Timer. |
Dispose(WaitHandle) |
Zwalnia wszystkie zasoby używane przez bieżące wystąpienie i Timer sygnały, gdy czasomierz został usunięty. |
DisposeAsync() |
Zwalnia wszystkie zasoby używane przez bieżące wystąpienie programu Timer. |
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
Finalize() |
Umożliwia obiektowi próbę zwolnienia zasobów i wykonania innych operacji oczyszczania przed odzyskaniem przez odzyskiwanie pamięci. |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetLifetimeService() |
Przestarzałe.
Pobiera bieżący obiekt usługi okresu istnienia, który kontroluje zasady okresu istnienia dla tego wystąpienia. (Odziedziczone po MarshalByRefObject) |
GetType() |
Type Pobiera bieżące wystąpienie. (Odziedziczone po Object) |
InitializeLifetimeService() |
Przestarzałe.
Uzyskuje obiekt usługi okresu istnienia, aby kontrolować zasady okresu istnienia dla tego wystąpienia. (Odziedziczone po MarshalByRefObject) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
MemberwiseClone(Boolean) |
Tworzy płytkią kopię bieżącego MarshalByRefObject obiektu. (Odziedziczone po MarshalByRefObject) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
Metody rozszerzania
ConfigureAwait(IAsyncDisposable, Boolean) |
Konfiguruje sposób oczekiwania na zadania zwracane z asynchronicznego jednorazowego wykonania. |
Dotyczy
Bezpieczeństwo wątkowe
Ten typ jest bezpieczny wątkowo.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla